python - 无法从 CPython 读取巨大(20GB)文件

标签 python file io

我有一些我无法理解的 CPython 问题。这一切都归结为这样一个事实:使用相同的代码读取小文本文件可以工作,但甚至无法从 20GB txt 文件中读取一行。

一些有用的信息:

  • 较小的文件 ~1MB 是 20GB 大文件的子集(从开始处起 1MB)
  • 这两个文件都是文本文件,行宽约为 2000 个字符,由 CR (\r) 分隔

显而易见的解决方案:

f = open(r'filename', 'r')
for line in f:
    print(line)
f.close()

有效...但是..仅适用于短文件。因为大的永远挂起(或者比打印至少第一行所花费的时间更长)。

所以我想至少尝试读这样的一行:

f = open(r'filename', 'r')
print(f.readline())
f.close()

这里的情况类似 - 立即适用于小文件,但在经过相当长的时间后才适用于大文件:

Traceback (most recent call last):
  File "***", line 16, in <module>
    print(f.readline())
SystemError: ..\Objects\stringobject.c:3902: bad argument to internal function

我到底应该如何读取大文本文件?

更新:

事实证明,拥有充足 sleep 的人思维会更清晰;-)。问题解决了 - 原来我忽略了文档中的一句话:

Python is usually built with universal newlines support; supplying 'U' opens the file as a text file, but lines may be terminated by any of the following: the Unix end-of-line convention '\n', the Macintosh convention '\r', or the Windows convention '\r\n'.

只是认为默认情况下通用换行符是“打开”的。

我的上述声明是:

print(f.readline())

只读了一行部分错误(我的错)。还记得我说过我的小文件是通过大文件的一部分创建的吗?在此操作期间,行结尾从 (CR) 更改为 (CRLF),所以我看到的是第一行。所有这些让我认为问题不在于行尾。

感谢大家的时间和帮助。

最佳答案

虽然您的“测试”只打印一行,但这并不意味着它只从文件中读取一行。对于我来说,在 \r 分隔的测试文件中,我也只得到一行输出。但是,如果我使用 for 循环读取每一行,它仍然只打印一行。或者,如果我在多行文件上再次尝试 readline() ,它不会再给出任何行。

尝试在同一文件上使用 'rU' 参数打开文件:

f =  open('filename', 'rU')

我对包含多行 \r 分隔文本的文件进行的测试给出:

f = open('test.txt','r')  # Opening the "wrong" way
for line in f:
    print line

输出:

abcdef

然后使用rU:

f = open('test.txt','rU')
for line in f:
    print line

输出:

abcdef

abcdef

abcdef

abcdef

abcdef

编辑:为了支持 Joran 的解释,此测试几乎表明整个文件正在加载,并且当您只看到一行时回车符会导致过度打印输出...

f = open('test.txt','r')     #  Opening the "wrong" way again
for line in f:
    print "XXX{}YYY".format(line)

输出被覆盖...

YYYdefdef

关于python - 无法从 CPython 读取巨大(20GB)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19844523/

相关文章:

Python - Pandas Dataframe 获取 n 行的平均值

python - 在列表之间插入的最有效方法?

python - 如何将 web URL.text 数据转换为 Dataframe

c++ - 如何使用 C++ 提取由空行分隔的行并将其存储为数组

java - 使用 Netty 或其他轻量级 NIO 库的请求-响应

java - 如何通过 Servlet 的 doPost() 方法在 Tomcat 服务器上创建文件?

python - groupby 的替代方案,用于从整洁的 pandas DataFrame 生成汇总表

c# - 如何通过单个 WinForm 对话框获取文件夹或文件路径?

c++ - 如何使用 C++ 编辑文本文件中的一行?

java - 在 Java 中读取下一行