0

test.txtには、2行の文があります。

The heart was made to be broken.
There is no surprise more magical than the surprise of being loved.

コード内:

import re
file = open('test.txt','r')#specify file to open
data = file.readlines()
file.close()

print "---------------------------------------------------"
count = 0
for line in data:
    line_split = re.findall(r'[^ \t\n\r, ]+',line)
    count = count + 1
    def chunks(line_split, n):
        for i in xrange(0, len(line_split), n):
            yield line_split[i:i+n]

    separate_word = list(chunks(line_split, 8))

    for i, word in enumerate(separate_word, 1):
        print count, ' '.join(word)
    print "---------------------------------------------------"

コードからの結果:

---------------------------------------------------
1 The heart was made to be broken.
---------------------------------------------------
2 There is no surprise more magical than the
2 surprise of being loved.
---------------------------------------------------

最初の行だけに文の数を表示する方法はありますか?

結果を期待する:

---------------------------------------------------
1 The heart was made to be broken.
---------------------------------------------------
2 There is no surprise more magical than the
  surprise of being loved.
---------------------------------------------------
4

2 に答える 2

1

それが最初の行かどうかを確認するだけです。

for i, word in enumerate(separate_word):
    if i == 0:
        print count, ' '.join(word)
    else:
        print " ", ' '.join(word)

このwithステートメントを使用してファイルを開くことを強くお勧めします。これはより読みやすく、例外の場合でもファイルを閉じる処理を行います。

もう1つの良いアイデアは、ファイルを直接ループすることです。これは、ファイル全体を一度にメモリにロードしないため、より良いアイデアです。これは不要であり、大きなファイルで問題を引き起こす可能性があります。

enumerate()また、ここで行ったようにループオーバーを使用する必要があります。dataそうすると、手動で処理する必要がなくなりcountます。

またchunks()、繰り返し定義しているので、少し無意味です。最初に一度定義する方がよいでしょう。それを呼び出す場合、リストを作成する必要もありません-ジェネレーター上で直接反復することができます。

これをすべて修正すると、よりクリーンになります。

import re

def chunks(line_split, n):
    for i in xrange(0, len(line_split), n):
        yield line_split[i:i+n]

print "---------------------------------------------------"

with open("test.txt", "r") as file:
    for count, line in enumerate(file, 1):
        line_split = re.findall(r'[^ \t\n\r, ]+',line)
        separate_word = chunks(line_split, 8)
        for i, word in enumerate(separate_word):
            if i == 0:
                print count, ' '.join(word)
            else:
                print " ", ' '.join(word)

        print "---------------------------------------------------"

また、変数名が少し誤解を招く可能性があることにも注意してくださいword。たとえば、単語ではありません。

于 2012-05-05T22:10:05.753 に答える
0

Pythonにはテキストラッピングが組み込まれています。以下のフォーマットは完璧ではないことは認めますが、アイデアは得られます:-)

#!/usr/bin/env python

import sys
import textwrap

with open('test.txt') as fd:
    T = [line.strip() for line in fd]

for n, s in enumerate(T):
    print '-'*42
    sys.stdout.write("%d " % n)
    for i in textwrap.wrap(s, 45):
        sys.stdout.write("%s\n" % i)
print '-'*42

出力:

------------------------------------------
0 The heart was made to be broken.
------------------------------------------
1 There is no surprise more magical than the
surprise of being loved.
------------------------------------------
于 2012-05-05T22:44:40.013 に答える