2016-03-25 1 views
1

大きなテキストファイルから不要な文字を削除しようとしています(約3GB)。私は不要なフォワードとバックスラッシュをファイル全体で削除しようとしています。私は単語の間にチルダを保持したい、区切り文字として機能します。ファイルは次のように書式設定されています。私はすべての戻る/進むを削除したいと思う上の例ではそうPythonクリーニングデータ

Cornet~Chris Tyle 
Cornet\~Warren Vache 
Cornet~Roger Webster 
Cornet~\Grimethorpe Coll//iery Band 
Cornet/~Daniel Rollston 
Cornet~Murley Silver Band 
Chocolate~Chocolate liquor 
Chocolate~Theobroma cacao 
Chocolate~Meso/america 

(チルダを維持しながら)単語が読めるようにスラッシュ。私はこれにPython Regex式を使用しますか?別の方法としては、スラッシュを含む行を削除するだけですが、最後の手段として残したいと思います。

**編集:申し訳ありませんが、1つのことを言いました!ラインの一部は次のように表示されます。

Chocolate~ 
Chocolate~Theobroma cacao 
     ~Mesoamerica 

私も**前後スラッシュを除去することに加えて、チルダの前または後に、あなたのための

感謝をNULLであるすべての行を削除する必要があります助けて!

+5

、それは...のように、5行を取るだろう発します! 'tr -d/\\ < dirty.txt > clean.txt' – Amadan

+0

あなたが何を意味するのか分かります。私は私がする必要がなかった場合、私はPythonを使用していないだろう! – lsch91

+0

新しい要件のために更新されました: 'tr -d/\\ clean.txt'を実行してください。私は宿題でない限り*あなたが* Pythonを使わなければならない理由は分かりません。宿題には通常3Gbファイルは含まれていません... – Amadan

答えて

2

これは本当に簡単なことでしょうか? (私はfor line in fが発電機であると信じています。いずれかの方法は、それは、一度に1つの行を読み込み)

with open(filename, "r") as f: 
    for line in f: 
     line = line.replace("/", "") 
     line = line.replace("\\", "") 

UPDATE(OPも「の前またはチルダ後のどちらかはnullであるすべての行を削除したいです「

これは、チルダは、ホワイトスペースが先行する行をスキップし、残りの部分で前方に置き換えると、バックスラッシュます:

import re 

pattern = re.compile(r'\s+~') 

with open(filename, "r") as f: 
    for line in f: 
     if not pattern.match(line): 
      line = line.replace("/", "") 
      line = line.replace("\\", "") 
      print line 

NB:何であればよ本当に必要なのは、すべての行を "word + tilde + word"の形式で保持し、スラッシュを削除し、他のものをすべて破棄して、理解しやすくするということです。

+0

をインストールしなければならないでしょうチルドのいずれかの側が空白またはヌルを持っている場合は、行全体をeleteしたいでしょう。 line.replace()メソッドもこのような行に対応しますか? O.P.P. \〜O.P.P。曲 – lsch91

+0

"null"はどういう意味ですか?ヌルバイトのC文字列のように、ヌルバイト、 '\ 0'について話しているわけではありませんか?しかし、そうです、 'string.replace()'は、指定した文字または文字の組み合わせを削除し、2番目の引数(この場合は空の文字列)で置き換えます。白いスペースをチルダの前または後にのみ削除する場合は、少し複雑になります – jDo

+0

@ lsch91私の回答を更新しました – jDo

2

簡単に、str.replace()を使用してください。

注ダブル\\

は、それは二重のバックスラッシュを交換していないのではなく1つのバックスラッシュは他の

コードエスケープされています

​​

出力:

['Cornet~Chris Tyle', 'Cornet~Warren Vache', 'Cornet~Roger Webster', 'Cornet~Grimethorpe Colliery Band', 'Cornet~Daniel Rollston', 'Cornet~Murley Silver Band', 'Chocolate~Chocolate liquor', 'Chocolate~Theobroma cacao', 'Chocolate~Mesoamerica'] 
+0

ファイル全体を読むことなくこれを行う方法はありますか?どういうわけか)?ちょっと興味があるんだけど。 – Bahrom

+2

私はメモリに3GBの文字列を読み込むことにあまり熱心ではないでしょう... – Amadan

+0

編集:残念なことに1つのことを言いました!ラインの一部は次のように表示されます。 チョコレート〜 チョコレート〜カカオ 〜メソアメリカ 私も前に、または転送除去することに加えて、チルダ後のどちらかNULLであるすべての行を削除する必要があり、バックスラッシュ – lsch91

1

をTr Y:

import re 

rx = re.compile(ur'[/\\]+', re.MULTILINE) 

inFile = "input.txt" 
outFile = "output.txt" 

with open(inFile, 'r') as f_in: 
    with open(outFile,'w') as f_out: 
     for line in f_in: 
      cleanLine = re.sub(rx, '', line).strip() 
      if cleanLine.startswith('~') or cleanLine.endswith('~'): 
       continue 
      f_out.write(cleanLine + '\n') 

このコードは、入力ファイルから開始またはチルダ~で終わる\ /や線を除去し、清浄化出力ファイルを書き込んでいます。

入力テキストに基づいて、それはPythonは、このためのやり過ぎである

Cornet~Chris Tyle 
Cornet~Warren Vache 
Cornet~Roger Webster 
Cornet~Grimethorpe Colliery Band 
Cornet~Daniel Rollston 
Cornet~Murley Silver Band 
Chocolate~Chocolate liquor 
Chocolate~Theobroma cacao 
Chocolate~Mesoamerica 
Chocolate~Theobroma cacao 
+0

これは良いと思います。私はOPがどんなものなのか正確には分かっていませんが、チルダで区切られた2つの単語を含む行だけが必要な場合は、行を取り除き、開始または末尾のチルダを探すことが、空白を探すよりも優れています私がやっていたように。 +1 – jDo