2011-08-05 14 views
2

私は、ファイルを取って分割標識としてキーワードを使ってサブファイルに分割する方法を理解しようとしています。Pythonでキーワードを含むファイルにファイルを分割しますか?

Racecar
line2...
line3...
Racecar
line5...
line6...
line7...
line8...
Racecar
:私の場合、私はこのようになり、大きなファイルを持っています10

単語Racecarが出現するたびに、ファイルを分割してサブファイルを作成したいと思います。上記の例を使用すると、File_1は3行、File_2は5行、File_3は2行になります。

File_1:
Racecar
line2...
line3...

File_2:
Racecar
line5...
line6...
line7...
これらのファイルは次のようになります。 210

File_3:
Racecar
line10...

は、私のようなものを実現するのsedやawkは、このに適しだろうが、私はPythonでこれを実行する必要があります。私は何らかの理由でこれに固執しています。

with open("bigfile", mode="r") as bigfile: 
    reader = bigfile.readlines() 
    for i,line in enumerate(reader): 
     if line.startswith("Racecar"): 
      header = line 
      header_num = i 

は私がレーシングカーの次の発生を取得する方法を見つけることができないため、立ち往生しているようだ。私はこのような何かを書き込もうとしました。私はnext()関数を使いたいと思っていますが、明らかにこれは文字列では機能しません。私が使用しているファイルは、メモリに読み込めるほど小さいです。誰もこれで私を助けることができますか?前もって感謝します。

+0

QNXについてPythonは必要ありません。 [正規表現/パターンが見つかると、QNXの分割はファイルを分割できます](http://www.qnx.com/developers/docs/6.5.0/topic/com.qnx.doc.neutrino_utilities/s/split.html)。 – user712092

答えて

3
with open("bigfile", mode="r") as bigfile: 
    reader = bigfile.read() 
    for i,part in enumerate(reader.split("Racecar")): 
     with open("File_" + i+1, mode="w") as newfile: 
      newfile.write("Racecar"+part) 
+0

'readlines'はリストを返し、存在しないsplitを呼び出しています。 –

+0

@Chrisあなたが正しいです、私は私の答えを更新しました。 – Vader

+0

@Vader、行のリストを読んでから参加するのは無駄に見えます。 'bigfile.read()'はどうでしょうか? – senderle

0
out_array = [] 
with open("bigfile", mode="r") as bigfile: 
    for line in bigfile: 
     if line.startswith("Racecar"): 
      out_array.append(line) 
     else: 
      out_array[-1] += line 

for i in range(len(out_array)): 
    out_filename = "File%d.txt" % i 
    with open(out_filename, mode="w") as out_file: 
     out_file.write(out_array[i]); 

おそらく2つのループを回避するより効率的な方法があります。しかし、それがあなたの主張と同じくらい小さいなら、それは問題ではないはずです。

0

あなたはRacecarの次の発生を得る方法を見つけたようです。あなたのforループは最終的にすべてに到達します。問題は、あなたがそれらに達するときに何をすべきかということです。私は

を行うためのものは、あなたが(冗長readlinesなしだが)そうであるように大型ファイル内の行を反復することであるように思える、と毎回など、あなたがheaderとするために行っている何header_numを理解していませんRacecar行をヒットし、新しい出力ファイルを開きます。

としては、中:

with open("bigfile", mode="r") as bigfile: 
    smallfile_prefix = "File_" 
    file_count = 0 
    smallfile = open(smallfile_prefix + str(file_count), 'w') 
    for line in bigfile: 
     if line.startswith("Racecar"): 
      smallfile.close() 
      file_count += 1 
      smallfile = open(smallfile_prefix + str(file_count), 'w') 
     else: 
      smallfile.write(line) 
    smallfile.close() 

これを行うには、他の方法があります - Vader's answer上のいくつかのバリエーションは、例えば、おそらく優れている - これはあなたの独創的なアプローチに最も近いと思われます。

関連する問題