python - Python 2.7 中的 Open() 和 codecs.open() 行为异常不同

标签 python python-2.7 file-io codec python-unicode

我有一个文本文件,第一行是 unicode 字符,所有其他行都是 ASCII。 我尝试将第一行作为一个变量读取,将所有其他行作为另一个变量读取。但是,当我使用以下代码时:

# -*- coding: utf-8 -*-
import codecs
import os
filename = '1.txt'
f = codecs.open(filename, 'r3', encoding='utf-8')
print f
names_f = f.readline().split(' ')
data_f = f.readlines()
print len(names_f)
print len(data_f)
f.close()
print 'And now for something completely differerent:'
g = open(filename, 'r')
names_g = g.readline().split(' ')
print g
data_g = g.readlines()
print len(names_g)
print len(data_g)
g.close()

我得到以下输出:

<open file '1.txt', mode 'rb' at 0x01235230>
28

7

And now for something completely differerent:

<open file '1.txt', mode 'r' at 0x017875A0>

28

77

如果我不使用 readlines(),则会读取整个文件,而不仅仅是 codecs.open() 和 open() 的前 7 行。

为什么会发生这样的事情? 为什么 codecs.open() 以二进制模式读取文件,尽管添加了“r”参数?

更新:这是原始文件:http://www1.datafilehost.com/d/0792d687

最佳答案

因为您使用了 .readline() first,所以 codecs.open() 文件已经填充了一个行缓冲区;随后对 .readlines() 的调用返回缓冲的行。

如果您再次调用 .readlines() ,将返回其余行:

>>> f = codecs.open(filename, 'r3', encoding='utf-8')
>>> line = f.readline()
>>> len(f.readlines())
7
>>> len(f.readlines())
71

解决方法是不要混合使用 .readline().readlines():

f = codecs.open(filename, 'r3', encoding='utf-8')
data_f = f.readlines()
names_f = data_f.pop(0).split(' ')  # take the first line.

这种行为确实是一个错误; Python 开发人员知道这一点,请参阅 issue 8260 .

另一种选择是使用 io.open()而不是 codecs.open()io 库是 Python 3 用来实现内置 open() 函数的库,它比 codecs 更健壮和通用模块。

关于python - Python 2.7 中的 Open() 和 codecs.open() 行为异常不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16130904/

相关文章:

python - 尽管具有相同的列,但 xgboost 中的 feature_names 不匹配

python - sqlalchemy 整数列大小

python - 按列迭代 scipy 稀疏矩阵

python - Python中的错误处理可以检测程序状态

c# - 用一种方法打开文件,用另一种方法写入

matlab - 将单元格元素打印到文本文件

python - 在python中取消慢速下载

python - 在 azure 上的 blob 中存储值列表时,“list”对象没有属性 'encode'

python - Python 中十六进制数的二进制补码

读取文件期间的 C++ 数据损坏