2017-05-23 12 views
1

5セクションのデータを持つ.txtファイルがあります。各セクションにはヘッダー行「セクションX」があります。私はこの1つのファイルから5つの別々のファイルを解析して書きたいと思います。セクションはヘッダーで始まり、次のセクションヘッダーの前で終了します。以下のコードは5つの別々のファイルを作成します。しかし、それらはすべて空白です。Python - 単一ファイルのセクションごとに別々のファイルを書き込む

from itertools import cycle 

filename = raw_input("Which file?: \n") 

dimensionsList = ["Section 1", "Section 2", 
    "Section 3", "Section 4", "Section 5"] 

with open(filename+".txt", "rb") as oldfile: 
    for i in dimensionsList: 
     licycle = cycle(dimensionsList) 
     nextelem = licycle.next() 
     with open(i+".txt", "w") as newfile: 
      for line in oldfile: 
       if line.strip() == i: 
        break 
      for line in oldfile: 
       if line.strip() == nextelem: 
        break 
       newfile.write(line) 

答えて

1

問題

あなたのコードをテストする、それが唯一の第1のために働いていた(と他の人があまりにも、私にとっては空白でした)。私は問題がセクション間の移行であることを認識しました(そしてまた、すべての反復で再開するlicycle)。

セクション2は、forif line.strip() == nextelem)の2番目のセクションに記載されています。次の行は、セクション2のデータです(テキストはSection 2ではありません)。

それは、言葉によっては難しいですが、以下のコードをテスト:

from itertools import cycle 

filename = raw_input("Which file?: \n") 

dimensionsList = ["Section 1", "Section 2", "Section 3", "Section 4", 
        "Section 5"] 

with open(filename + ".txt", "rb") as oldfile: 
    licycle = cycle(dimensionsList) 
    nextelem = licycle.next() 
    for i in dimensionsList: 
     print(nextelem) 
     with open(i + ".txt", "w") as newfile: 
      for line in oldfile: 
       print("ignoring %s" % (line.strip())) 
       if line.strip() == i: 
        nextelem = licycle.next() 
        break 
      for line in oldfile: 
       if line.strip() == nextelem: 
        # nextelem = licycle.next() 
        print("ignoring %s" % (line.strip())) 
        break 
       print("printing %s" % (line.strip())) 
       newfile.write(line) 
      print('') 

それを印刷します:

Section 1 
ignoring Section 1 
printing aaaa 
printing bbbb 
ignoring Section 2 

Section 2 
ignoring ccc 
ignoring ddd 
ignoring Section 3 
ignoring eee 
ignoring fff 
ignoring Section 4 
ignoring ggg 
ignoring hhh 
ignoring Section 5 
ignoring iii 
ignoring jjj 

Section 2 

Section 2 

Section 2 

をそれは、セクション1のために働いて、それはセクション2を検出したが、それは無視し続けこれは「セクション2」が見つからないためです。

(常に1行目から)行を再起動するたびに、私はプログラムが動作すると思います。しかし、私はよりシンプルなコードを作ってくれました。それは、セクションを見つけた場合

ソリューション

from itertools import cycle 

filename = raw_input("Which file?: \n") 

dimensionsList = ["Section 1", "Section 2", "Section 3", "Section 4", 
        "Section 5"] 

with open(filename + ".txt", "rb") as oldfile: 

    licycle = cycle(dimensionsList) 
    nextelem = licycle.next() 
    newfile = None 
    line = oldfile.readline() 

    while line: 

     # Case 1: Found new section 
     if line.strip() == nextelem: 
      if newfile is not None: 
       newfile.close() 
      nextelem = licycle.next() 
      newfile = open(line.strip() + '.txt', 'w') 

     # Case 2: Print line to current section 
     elif newfile is not None: 
      newfile.write(line) 

     line = oldfile.readline() 

が、それはこの新しいファイルに書き込みを開始します。それ以外の場合は、この現在のファイルに書き込みを続けます。

Psを.:以下、私が使用した例として、ファイル:

Section 1 
aaaa 
bbbb 
Section 2 
ccc 
ddd 
Section 3 
eee 
fff 
Section 4 
ggg 
hhh 
Section 5 
iii 
jjj 
関連する問題