我有一些我无法理解的CPython问题.这一切都归结为使用相同的代码来读取小文本文件但无法读取20GB txt文件中的单行这一事实.
一些有用的信息:
明显的解决方案:
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),所以我看到的是第一行.所有这些让我觉得这个问题不在线.
谢谢大家的时间和帮助.
虽然您的"测试"只打印一行,但这并不意味着它只读取文件中的一行.对于我来说,在一个定\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)
| 归档时间: |
|
| 查看次数: |
355 次 |
| 最近记录: |