2012-05-05 7 views
0

test.txtには、2行の文章があります。コードから最初の行に文の行番号(複数行)を表示する方法は?

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 "---------------------------------------------------" 

結果::コードで

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

--------------------------------------------------- 
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. 
--------------------------------------------------- 
+1

ドン」タイトルに言語名を追加する - これがタグの目的です。 –

答えて

1

それは最初の行だ場合だけチェック:

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

を私は強くあなたがファイルを開くためにthe with statementを使用することをお勧め。これはより読みやすく、例外の場合でもファイルを閉じる処理をします。

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

countを手作業で処理しないように、dataのループでここで行ったように、enumerate()も使用する必要があります。

また、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少し誤解を招くあり、例えば、言葉ではありません。

+0

i == 0は何も表示しません。もしi == 1なら正しいです。 – ThanaDaray

+0

@ThanaDaray私の変更が 'enumerate(separate_word、1)'から 'enumerate(separate_word)'に変わったことに注意してください。 –

+0

@sarnoldうわー、修正済み。 –

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. 
------------------------------------------ 
関連する問題