【问题标题】:Python file read difference between "rb" and "rt" [duplicate]“rb”和“rt”之间的Python文件读取差异[重复]
【发布时间】:2017-07-23 01:54:05
【问题描述】:

我有以下代码。因为我以二进制模式打开文件,所以将读取到变量“line”中的内容。是吗

  1. 读取直到出现换行符。返回并重复
  2. 读取直到某个内部缓冲区大小或换行符。返回并重复
with open('filename', mode='rb') as f:
    for line in f:
      do_some_process(line)

之前建议的其他答案不回答这个问题。他们讨论了模式之间的差异,但这里的问题是,假设我以二进制模式读取文本文件,并且我想确保我逐行读取,即读取直到出现换行符。 'b' 模式似乎正在这样做,但这是否保证总是发生? 'b' 模式是否读取数据直到出现新行或直到缓冲区大小?我试图了解 Python 如何在后台处理这个问题。

【问题讨论】:

  • 您可能想阅读以下内容:stackoverflow.com/questions/9644110/…
  • 我对你建议的线程有一个稍微不同的问题。因为文件是二进制模式,所以没有行尾字符的概念。然而,这段代码似乎仍然是逐行阅读的。它是如何做到的。这是否意味着它正在解释字符并阅读直到 EOL?

标签: python


【解决方案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

【讨论】:

  • 阿里,我理解你的解释,但我有一个稍微不同的问题。因为文件是二进制模式,所以没有行尾字符的概念。然而,这段代码似乎仍然是逐行阅读的。可以假设总是这样吗?
  • 如果你在 'rb' 模式下检查 opend 文件的子类,你可以看到有 .readline() ,所以即使在 'rb' mod steel 中,你也可以让它理解换行符至少当我们使用 .readline() 子类时,我认为当我们执行 list(OPEND_FILES_IN_rb) 时,它实际上会返回 .readline() 子类的所有可能输出,这就是为什么我们看到输出内部列表除以换行符,否则它应该返回所有文件作为单个字符串
  • 不确定我是否关注。错别字让人难以理解。你能帮忙吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-01
  • 2018-06-22
  • 2012-11-21
  • 2012-12-16
  • 2018-07-24
  • 1970-01-01
  • 2012-03-10
相关资源
最近更新 更多