2017-10-25 27 views
0

私はまさに2つのプログラムを持っています。私はそれらを1つのプログラムにまとめようとしています。そして、これは私が助けを必要とする場所です。ファイルを読み込み、処理し、チャンクでファイルに書き込む

プログラム#1は、ファイル全体を読み込み、readlines()処理してから新しいファイルに書き込みます。完璧に動作します。

コード:

datafile = "d:\\python\\workbook\\countries-raw.txt" 

with open(datafile, "r") as file: 
    content = file.readlines() 

content = [i.strip('\n') for i in content if '\n' in i] 
content = [i for i in content if i != ""] 
content = [i for i in content if i != "Top of Page"] 
content = [i for i in content if len(i) != 1] 

print(content) 

newfile = "d:\\python\\workbook\\countries-raw-2.txt" 

with open(newfile, "w") as file2: 
    for i in content: 
     file2.write(i + '\n') 

プログラム#2は、一度にチャンク、Xラインでファイルを読み込みます。その後、一度にX行のデータを に出力します。また、意図したとおりに動作します。

サンプル出力を持つコード:

textfile = "d:\\mark\\python\\test.txt" 


def read_n(file, x): 
    with open(file, mode='r') as fh: 
     while True: 
      data = ''.join(fh.readline() for _ in range(x)) 

      if not data: 
       break 

      yield data 


for nlines in read_n(textfile, 5): 
    print(nlines) 

'''  
    abc 
    123 
    def 
    456 
    ghi 

    789 
    jkl 
    abc 
    123 
    def 

    456 
    ghi 
    789 
    jkl 
    abc 

    123 
    def 
    456 
    ghi 
    789 

    jkl 
    abc 
    123 
    def 
    456 

    ghi 
    789 
    jkl 
''' 

私は望んでいます、何がその機能を組み合わせることです。 2千万(またはそれ以上)のテキスト行を含むファイルを処理する必要があるとします。私は がファイル全体を読んで、プログラム#1のような巨大なリストを作成することができないかもしれません。 1行で

読む:それは不必要に遅くなるよう

しかし、これはそうです。 行を処理します。 行を書きます。 ファイル全体が処理されるまで繰り返します。

私は私の第二のプログラムのロジックがここに素晴らしいことだ考えていた:

読むXの行。 すべてのX行を処理します。 行を書きます(私が行っていることに応じて正確にXではないかもしれません)。 ファイル全体が処理されるまで繰り返します。

この私が持っているものですが、それは動作しません。最低でも(。最終的理解が処理された後、リスト内のコンテンツを注意[コンテンツ]が正しい)

textfile = "d:\\python\\workbook\\countries-raw.txt" 
newfile = "d:\\python\\workbook\\temp-2.txt" 

def read_n(file, x): 
    with open(file, mode='r') as fh: 
     while True: 
      data = ''.join(fh.readline() for _ in range(x)) 
      content = data.split('\n') 
      content = [i for i in content if i != ""] 
      content = [i for i in content if i != "Top of Page"] 
      content = [i for i in content if len(i) != 1] 

      if not content: 
       break 

      yield content 


for nlines in read_n(textfile, 50): 
    with open(newfile, "w") as file2: 
     for item in content: 
      content.write(item + '\n') 
    print(nlines) 

私はスコープの問題を持っていますPyCharmは下位の印刷セクションで 'content'が不明であるためです。また、可能であれば、ファイルが書き込まれるときに、プログラム#2の出力に表示されるように、データ間にスペースを入れたくありません。

答えて

0

私はちょうどそれを考え出した:

for nlines in read_n(textfile, 50): with open(newfile, "a") as file2: for item in nlines: file2.write(item + '\n') print(nlines)

関連する問題