2013-12-20 5 views
6

私はPythonスクリプトを使用して処理する必要がある、大きなコンマ区切りのテキストファイル(最大は約15GB)をいくつか持っています。問題は、ファイルの中に散発的にDOS EOF(Ctrl-Z)文字が含まれていることです。 (なぜ私はそれらを生成しなかったのか尋ねないでください)。もう1つの問題は、ファイルがWindowsマシン上にあることです。Windows上でPythonを使用してEOF/Ctrl-Z文字を含む巨大なテキストファイルを処理する方法は?

Windowsでは、スクリプトでこれらの文字のいずれかが検出されると、ファイルの最後にあるとみなされ、処理が停止します。さまざまな理由から、私は他のマシンにファイルをコピーすることは許可されていません。しかし、私はまだそれらを処理する必要があります。ここで

は私のアイデアは、これまでのところ、次のとおりです。

  1. chr(26)に等しいバイトを投げ、バイナリモードでファイルを読み込みます。これはうまくいくが、それはほぼ永遠に続くだろう。
  2. sedのようなものを使用して、EOF文字を削除します。残念ながら、私が言うことができる限り、Windows上のsedは同じ問題を抱えており、EOFが見えるときに終了します。
  3. 何らかの種類のNotepadプログラムを使用して、検索と置換を行います。しかし、Notepad型プログラムは15GBファイルにうまく対応していないことが判明しました。

私の理想的なソリューションは、単なるテキストとしてファイルを読んで、単純にCtrl-Zの文字を無視するためにいくつかの方法だろう。これを達成するための合理的な方法はありますか?

+1

Cygwinのような擬似Unix環境下で 'sed'を実行してみましたか?これはまさにこの目的のために作られたもので、私はそこにEOF文字の周りの道がイメージしなければなりません。 – MattDMo

+0

これは、テキストファイルのCtrl + ZをEOFとして扱うPythonではありません。 Windowsでは、どのプログラミング言語でも、テキストモードでファイルを開くことは不可能であり、Ctrl + Zをファイルの終わりとして扱うことはできません。 –

+1

@TimPeters、私はそれが当てはまるとは思わない - 私はWindows API ['CreateFile'](http://msdn.microsoft.com/en-us/library/windows/)でバイナリ/テキストフラグを見つけることを敢行するdesktop/aa363858(v = vs.85).aspx)。それは慣習が非常に普及しているので、それらをバイパスするのは難しいです。 –

答えて

6

Pythonを使用してDOS EOF文字を削除するのは簡単です。例えば、最初の引数としてファイルパスを取る

def delete_eof(fin, fout): 
    BUFSIZE = 2**15 
    EOFCHAR = chr(26) 
    data = fin.read(BUFSIZE) 
    while data: 
     fout.write(data.translate(None, EOFCHAR)) 
     data = fin.read(BUFSIZE) 

import sys 
ipath = sys.argv[1] 
opath = ipath + ".new" 
with open(ipath, "rb") as fin, open(opath, "wb") as fout: 
    delete_eof(fin, fout) 

、コピーファイル添付.newと同じファイルパスにchr(26)バイトはありません。味わうためにフィドル。

ところで、 DOS EOF文字は唯一の問題ですか?ファイルのテキストファイルとして扱われることになってしまうような気がしない。

+0

プロジェクトのこの時点で、私はあらゆる種類の* intent *をファイルを提供した人の一部。 :P これは間違いなく私の唯一の問題ではありませんが、間違いなく私の*最大の*問題です。 – Joel

関連する問題