我有以下代码。因为我以二进制模式打开文件,所以将读入变量“line”。是吗
with open('filename', mode='rb') as f: for line in f: do_some_process(line)
之前建议的其他答案不回答这个问题。他们谈论模式之间的差异,但问题是,假设我在二进制模式下读取文本文件,我想确保我逐行读取,即读取直到出现换行符。 'b'模式似乎正在这样做,但这是否保证总会发生? 'b'模式是否在新线出现或直到大小之前读取数据?我试图了解Python如何处理这个问题。
答案 0 :(得分:1)
你可以在txt文件中同时使用'rt'和'rb',结果在语言为英语的情况下不会有太大的不同,请看:
>>> f = open('test.txt','rb')
<_io.BufferedReader name='test.txt'>
>>> list(f)
[b'FzListe\n', b'7MA1, 7OS1\n', b'7MA1, 7ZJB\n', b'\n', b'\n', b'7MA2, 7MA3, 7OS1\n', b'76G1, 7MA1, 7OS1\n', b'7MA1, 7OS1\n', b'71E5, 71E6, 7MA1, FSS1\n']
>>>
>>> f = open('test.txt','rt')
>>> list(f)
['FzListe\n', '7MA1, 7OS1\n', '7MA1, 7ZJB\n', '\n', '\n', '7MA2, 7MA3, 7OS1\n', '76G1, 7MA1, 7OS1\n', '7MA1, 7OS1\n', '71E5, 71E6, 7MA1, FSS1\n']
如果文件包含多种语言,则会发生这种情况,请查看二进制部分,它不会对UTF-8等字符进行任何解码:
>>> f = open('test.txt','rt')
>>>
>>> list(f)
['علی\n', 'FzListe\n', '7MA1, 7OS1\n', '7MA1, 7ZJB\n', '\n', '\n', '7MA2, 7MA3, 7OS1\n', '76G1, 7MA1, 7OS1\n', '7MA1, 7OS1\n', '71E5, 71E6, 7MA1, FSS1\n']
>>>
>>> f = open('test.txt','rb')
>>> list(f)
[b'\xd8\xb9\xd9\x84\xdb\x8c\n', b'FzListe\n', b'7MA1, 7OS1\n', b'7MA1, 7ZJB\n', b'\n', b'\n', b'7MA2, 7MA3, 7OS1\n', b'76G1, 7MA1, 7OS1\n', b'7MA1, 7OS1\n', b'71E5, 71E6, 7MA1, FSS1\n']
所以答案是肯定的,具体取决于您使用的文件,您可以在同一文件上的'rt'和'rb'上得到几乎相同或不同的结果
但你不能像图片文件那样在二进制文件上使用'rt',因为它无法理解其编解码器并引发错误:
>>> f = open('test.jpg','rt')
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.5/codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9f in position 0: invalid start byte