当前位置: 首页 > 面试题库 >

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

闽念
2023-03-14
问题内容

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

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

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

  1. 以二进制模式读取文件,抛出等于的字节chr(26)。这会起作用,但是大约需要永远。
  2. 使用类似的sed方法消除EOF字符。不幸的是,据我所知,sed在Windows上存在相同的问题,并且在看到EOF时将退出。
  3. 使用某种Notepad程序并进行查找和替换。但是事实证明,Notepad-type程序不能很好地处理15GB的文件。

我的IDEAL解决方案是通过某种方式将文件读取 为文本, 而忽略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字符是您唯一的问题吗?很难想象有一种合理的方式可以将它们最终存储在 旨在 被视为文本文件的文件中。



 类似资料:
  • 问题内容: 我有一个巨大的文本文件(〜1GB),可惜我使用的文本编辑器无法读取这么大的文件。但是,如果我可以将其分为两部分或三部分,那就没问题了,因此,作为练习,我想用python编写一个程序来做到这一点。 我想让程序执行的操作是找到文件的大小,将该数字分成多个部分,然后对于每个部分,逐块读取至该点,写入 文件名.nnn输出文件,然后读取- 到下一个换行符并将其写入,然后关闭输出文件,等等。显然,

  • 问题内容: 我有相对较小的对象的巨大(〜7GB)json数组。 有没有一种相对简单的方法可以过滤这些对象而无需将整个文件加载到内存中? --stream 选项看起来合适,但我不知道如何将[path,value]的流折叠到原始对象。 问题答案: jq 1.5具有流解析器。jq FAQ提供了一个示例,该示例如何将JSON对象的顶级数组转换为其元素流: 这可能足以满足您的目的,但是值得注意的是setpa

  • 如何查找在其文件内容中包含特定文本字符串的所有文件? 下面不行。它似乎显示了系统中的每一个文件。

  • 如何查找在其文件内容中包含特定文本字符串的所有文件? 以下方法不起作用。它似乎显示系统中的每个文件。

  • 问题内容: 在Stack Overflow上使用Selenium WebDriver上传文件时,我已经看到很多问题和解决方案。但是它们都不适合以下情况。 有人给出了以下解决方案 但是我仍然找不到窗口句柄。我该如何处理? 我正在寻找上述方案的解决方案。 请在以下任何网站上进行检查。 问题答案: 如果使用Zamzar网站,它应该可以正常运行。你无需单击该元素。你只需在其中输入路径。具体来说,这绝对可以

  • 问题内容: 我有一个很大的文本文件,但是没有换行符。它只包含一个很长的字符串(包含所有ASCII字符的1行巨大的字符串),但是到目前为止一切正常,因为我可以将整行读入Java的内存中,但是我想知道是否有内存由于文件变得如此之大(如5GB +),并且程序无法一次将整个文件读入内存,因此出现泄漏问题,那么在那种情况下,读取此类文件的最佳方法是什么?我们可以将巨大的线条分成2个部分,甚至多个块吗? 这是