无法从CPython读取大量(20GB)文件

Art*_*tur 2 python io file

我有一些我无法理解的CPython问题.这一切都归结为使用相同的代码来读取小文本文件但无法读取20GB txt文件中的单行这一事实.

一些有用的信息:

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

明显的解决方案:

f = open(r'filename', 'r')
for line in f:
    print(line)
f.close()
Run Code Online (Sandbox Code Playgroud)

有效......但是......仅供短文件使用.因为大的人永远挂起(或者至少应该打印至少第一行).

所以我想至少尝试读一行如下:

f = open(r'filename', 'r')
print(f.readline())
f.close()
Run Code Online (Sandbox Code Playgroud)

类似的情况在这里 - 适用于小文件,但是对于大文件,经过大量时间吐出该消息:

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

我应该怎么读一个大文本文件?

更新:

原来人类认为更清楚,有足够的睡眠;-).问题解决了 - 结果我忽略了文档中的一句话:

Python通常使用通用换行符支持构建; 提供'U'将文件作为文本文件打开,但行可以通过以下任何一种方式终止:Unix行尾约定'\n',Macintosh约定'\ r'或Windows约定'\ r\N".

只是认为通用换行符默认为"开启".

我的上述说法:

print(f.readline())
Run Code Online (Sandbox Code Playgroud)

只读一行是部分错误(我的坏).记得我说我的小文件是通过大块的大块创建的吗?在那个操作过程中,行结束从(CR)变为(CRLF),所以我看到的是第一行.所有这些让我觉得这个问题不在线.

谢谢大家的时间和帮助.

ber*_*roe 5

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

尝试使用'rU'同一文件中的参数打开文件:

f =  open('filename', 'rU')
Run Code Online (Sandbox Code Playgroud)

我对具有多行定\r界文本的文件的测试给出:

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

输出:

abcdef
Run Code Online (Sandbox Code Playgroud)

然后用rU:

f = open('test.txt','rU')
for line in f:
    print line
Run Code Online (Sandbox Code Playgroud)

输出:

abcdef

abcdef

abcdef

abcdef

abcdef
Run Code Online (Sandbox Code Playgroud)

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

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

输出被覆盖......

YYYdefdef
Run Code Online (Sandbox Code Playgroud)

  • 确实,甚至更好,"打印"你好\ ryou"` (2认同)