2

我读取了一个文件并调用read()after readline(),但该read()函数不返回其余内容。

我想使用编解码器读取一个名为“test.txt”的 utf-8 文件。内容如下表:

1572278
#*OQL[C++]: Extending C++ with an Object Query Capability.
#@José A. Blakeley
#year1995

我使用的代码:

import codes;
a = codecs.open('test.txt','r','utf-8');
b = a.readline();
c = a.read();

当我运行它时,我得到的是:

b:1572278
c:#*OQL[C++]: Extending C++ with an Object Query Capability.\r\n#@J

在这里,c不是整个文件的其余部分 - 我无法弄清楚。

4

3 回答 3

3

这是因为工作方式StreamReaderWriter。当你这样做时,readline()它会填充 alinebuffer当你调用时不为空read(),读取codecs.py代码,这将返回缓冲区中的任何内容,除非你指定size适用于你的输入文件的 a。

如果您想os.path.getsize用作提示read()

>>> import os
>>> a = codecs.open('test.txt', 'r', 'utf-8'); a.readline(); a.read(os.path.getsize('test.txt'))
u'1572278\n'
u'#*OQL[C++]: Extending C++ with an Object Query Capability.\n#@Jos\xe9 A. Blakeley\n#year1995\n'

既然你在啜饮文件;你可以先这样做并StringIO在上面使用。

>>> import StringIO
>>> a = codecs.open('test.txt', 'r', 'utf-8'); 
>>> buff = StringIO.StringIO(a.read())
>>> buff.readline()
u'1572278\n'
>>> buff.read()
u'#*OQL[C++]: Extending C++ with an Object Query Capability.\n#@Jos\xe9 A. Blakeley\n#year1995\n'

另一个简单的解决方案是调用read()两次,一次获取缓冲输出,另一次获取其余的输出。

>>> a = codecs.open('test.txt', 'r', 'utf-8'); a.readline(); a.read() + a.read()
u'1572278\n'
u'#*OQL[C++]: Extending C++ with an Object Query Capability.\n#@Jos\xe9 A. Blakeley\n#year1995\n'
于 2013-07-13T02:40:45.630 回答
0

编辑:我明白了。

这对你有用吗?

import codecs

def line_get(fileobj):
    while 1:
        d = fileobj.readline()
        if d:
            yield d
        else:
            fileobj.close()
            break

a = codecs.open('input','r','utf-8')
b = a.readline()
c = [line for line in line_get(a)]
于 2013-07-13T02:22:34.050 回答
0

read()电话似乎为我获取了文件的其余部分。也许您没有输出正确读取的内容-但是我无法确定,因为您没有在问题中包含执行此操作的代码。

顺便说一句,您不需要像使用 C 和 C++ 代码那样用分号结束 Python 代码行。

import codecs
a = codecs.open('test.txt', 'r', 'utf-8')
b = a.readline()
c = a.read()
a.close()

print('b:%r' % b)
print('c:%r' % c)

输出:

b:u'\ufeff1572278\r\n'
c:u'#*OQL[C++]: Extending C++ with an Object Query Capability.\r\n#@Jos\xe9 A. Blakeley\r\n#year1995\r\n'
于 2013-07-13T08:46:04.383 回答