2017-03-03 15 views
1

我有以下代碼。因爲我以二進制模式打開文件,會將什麼讀入變量「行」。是否Python文件讀取「rb」和「rt」之間的區別

  1. 直到出現新的換行符爲止。返回並重復
  2. 直到讀取一些內部緩衝區大小或新行字符。返回並重復
with open('filename', mode='rb') as f: 
    for line in f: 
     do_some_process(line) 

早先提出不回答這個問題的答案。他們談論模式之間的差異,但問題是,假設我正在以二進制模式讀取一個文本文件,並且我想確保我逐行讀取,即直到發生換行符爲止。 'b'模式似乎正在這樣做,但這是否保證總是會發生?在'b'模式下讀取數據直到出現新行或者直到buffere大小?我試圖去探討Python如何在包裝下處理這個問題。

+0

您可能需要閱讀本:HTTP:// stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode – sangheestyle

+0

我有一個稍微不同的問題,你建議的線程..因爲該文件是在二進制模式,沒有行結束字符的概念。但是這個代碼似乎仍然是逐行讀取的。它是如何做到的。這是否意味着它解釋字符和閱讀直到EOL? – kvb

回答

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 
+0

阿里,我理解你的解釋,但我有一個稍微不同的問題。由於文件處於二進制模式,因此不存在行尾字符的概念。但是這個代碼似乎仍然是逐行讀取的。這可以假設永遠是這樣嗎? – kvb

+0

如果你在'rb'模式下檢查opend文件的子類,你可以看到.readline(),所以即使在'rb'mod鋼中,你至少在使用.readline時可以使它理解新的行字符)子類,我認爲當我們執行列表(OPEND_FILES_IN_rb)時,它實際上會返回所有可能的.readline()子類的輸出,這就是爲什麼我們看到把它放在列表中除以換行符後,否則它應該將所有文件作爲單個字符串返回 – ali

+0

不知道我跟着。錯別字使得難以遵循。你能幫忙嗎。 – kvb

相關問題