如何在Windows上使用Python处理包含EOF / Ctrl-Z字符的大文本文件?

时间:2013-12-20 02:29:50

标签: python windows text sed eof

我需要使用Python脚本处理许多以逗号分隔的大型文本文件(最大值大约为15GB)。问题是文件偶尔会在它们中间包含DOS EOF(Ctrl-Z)字符。 (不要问我为什么,我没有生成它们。)另一个问题是文件在Windows机器上。

在Windows上,当我的脚本遇到其中一个字符时,它会认为它位于文件的末尾并停止处理。由于各种原因,我不允许将文件复制到任何其他计算机。但我仍然需要处理它们。

到目前为止,我的想法是:

  1. 以二进制模式读取文件,丢弃等于chr(26)的字节。这可行,但大约需要永远。
  2. 使用sed之类的内容消除EOF字符。不幸的是,据我所知,Windows上的sed有同样的问题,当它看到EOF时会退出。
  3. 使用某种Notepad程序并进行查找和替换。但事实证明,Notepad类型的程序无法很好地处理15GB文件。
  4. 我的IDEAL解决方案只是将文件作为文本读取,而忽略Ctrl-Z字符。有没有合理的方法来实现这个目标?

1 个答案:

答案 0 :(得分: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)

将文件路径作为其第一个参数,并将文件但没有chr(26)个字节复制到附加.new的同一文件路径。小提琴。

顺便问一下,你确定 DOS EOF字符是你唯一的问题吗?很难想象一种理智的方式,他们最终可以将文件打算作为文本文件处理。