如何在Windows上使用Python处理包含EOF/Ctrl-Z字符的大型文本文件?
我有许多以逗号分隔的大型文本文件(最大的约15GB),需要使用Python脚本处理。问题是,文件零星地包含DOS EOF(CTRL Z)字符在中间。(不要问我为什么,我没有生成它们。)另一个问题是文件在Windows计算机上 在Windows上,当脚本遇到其中一个字符时,它会假定它位于文件末尾并停止处理。由于各种原因,我不允许将文件复制到任何其他机器上。但我仍然需要处理它们 以下是我目前的想法:如何在Windows上使用Python处理包含EOF/Ctrl-Z字符的大型文本文件?,python,windows,text,sed,eof,Python,Windows,Text,Sed,Eof,我有许多以逗号分隔的大型文本文件(最大的约15GB),需要使用Python脚本处理。问题是,文件零星地包含DOS EOF(CTRL Z)字符在中间。(不要问我为什么,我没有生成它们。)另一个问题是文件在Windows计算机上 在Windows上,当脚本遇到其中一个字符时,它会假定它位于文件末尾并停止处理。由于各种原因,我不允许将文件复制到任何其他机器上。但我仍然需要处理它们 以下是我目前的想法: 以二进制模式读取文件,抛出等于chr(26)的字节。这是可行的,但它大约需要永远 使用类似于sed的
chr(26)
的字节。这是可行的,但它大约需要永远sed
的方法来消除EOF字符。不幸的是,据我所知,Windows上的sed
也有同样的问题,当它看到EOF时就会退出记事本
程序进行查找和替换。但事实证明,Notepad
类型的程序不能很好地处理15GB的文件我的理想解决方案是以文本形式读取文件,而忽略Ctrl-Z字符。有没有一种合理的方法来实现这一点?使用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字符是你唯一的问题吗?很难想象有一种理智的方式,可以让它们最终成为文本文件。使用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字符是你唯一的问题吗?很难想象有一种理智的方式可以让它们最终成为文本文件。您是否考虑过在Cygwin这样的伪Unix环境下运行
sed
?它正是为了这个目的而构建的,我必须想象有一种方法可以绕过EOF字符……不是Python在文本文件中将Ctrl+Z视为EOF:这是Windows文件系统的核心。在Windows上,在任何编程语言中,都不可能在文本模式下打开文件而不将Ctrl+Z视为文件结尾。@TimPeters,我不认为这是真的-我敢说,你可以在Windows API中找到二进制/文本标志。只是这些惯例太普遍了,很难绕过它们。@MarkRansom,你很可能是对的!除了为Python实现编写特定于Windows的代码外,我从不直接使用Windows API,因此尽可能少地了解它;-)您看过在Cygwin这样的伪Unix环境下运行sed
吗?它正是为了这个目的而构建的,我必须想象有一种方法可以绕过EOF字符……不是Python在文本文件中将Ctrl+Z视为EOF:这是Windows文件系统的核心。在Windows上,在任何编程语言中,都不可能在文本模式下打开文件而不将Ctrl+Z视为文件结尾。@TimPeters,我不认为这是真的-我敢说,你可以在Windows API中找到二进制/文本标志。只是这些惯例太普遍了,很难绕过它们。@MarkRansom,你很可能是对的!除了为Python实现编写特定于Windows的代码外,我从不直接使用Windows API,因此尽可能少地了解它;-)在项目的这一点上,我担心提供文件的人会有任何意图P这肯定不是我唯一的问题,但它肯定是我最大的问题。在项目的这一点上,我对提供文件的人的任何意图都持谨慎态度这肯定不是我唯一的问题,但肯定是我最大的问题。