我注意到在文檔中他們總是用'wb'打開一個CSV檔案。 為什麼'b'? 我知道b代表二進制模式,但是你什麼時候使用二進制模式(我猜想CSV檔案不是二進制模式)。 如果相關我是從arcpy.da.SearchCursor()查詢的結果寫入CSV
編輯:根據這個答案注意到wb+用于編寫二進制檔案。 什麼包括+呢?
如果有任何非ascii字元你應該使用二進制模式...在二進制模式下打開将永遠不會改變或損害你的資料afaik,但有時打開ascii模式将删除或更改字元...是以我總是打開 二進制模式(即使使用ascii資料)
@JoranBeasley:沒有"ascii模式"這樣的東西。 改為使用術語"文本模式"(文本檔案的字元編碼可以是任何東西)。
閱讀您已連結的問題的答案 - +表示您希望同時寫入和從檔案中讀取。
使用'b'模式,按原樣讀取/寫入二進制資料,無需進行任何轉換,例如将換行符轉換為特定于平台的值或使用字元編碼對文本進行解碼/編碼。
csv子產品很特别。 csv資料是文本,是以可以預期文本模式,但csv子產品預設使用'
'來終止所有平台上的行,并且它始終将'
'和'
'都識别為換行符。 如果您在文本模式下打開相應的檔案(使用通用換行符),那麼您将在Windows上獲得'
'(損壞的換行符)(os.linesep == '
')。 這就是Python 2文檔說你必須使用二進制模式的原因。 在Python 3中,使用了文本模式,但是您應該傳遞newline=''以禁用通用換行模式。
如果要保留字段中嵌入的可能換行符(例如'
'),您還需要禁用通用換行符。
要挑剔,傳遞newline=不會禁用通用換行模式。從文檔:"如果是,啟用通用換行模式,但行結尾傳回給調用者未翻譯。"
檔案打開預設是使用文本模式,它可以在寫入時将" n"字元轉換為特定于平台的表示,并在讀取時傳回。
在Windows中,這将修改從' n'到' r n'的換行符,這将在其他應用程式/平台中打開CSV檔案時出現問題。
是以,在打開二進制檔案時,您應該将'b'附加到模式值以在二進制模式下打開檔案,這将提高可移植性。在沒有這種差別的系統上,添加"b"無效。
注意:'w +'截斷檔案。
模式'r +','w +'和'a +'打開檔案進行更新(讀寫)。
詳情如下:https://docs.python.org/2/library/functions.html#open
什麼是"截斷"檔案,是否意味着替換?
相反。文本模式提高了代碼的可移植性(您可以讀取在其他平台上編寫的文本,本地編寫的檔案可以通過特定于平台的程式(如notepad.exe)來了解)。 csv是一種特殊情況,其中二進制模式用于文本資料
截斷表示如果檔案不存在則會建立該檔案,如果檔案存在則會被覆寫。是以是的,簡單來說就意味着取代。
我同意,"文本模式增加了可移植性,而csv隻是一種特殊情況,其中二進制模式用于文本資料"。
特别是對于Python csv子產品,答案很簡單:它是文檔所要求的。
If csvfile is a file object, it must be opened with the ‘b’ flag on platforms where that makes a difference.
資料來源:https://docs.python.org/2.7/library/csv.html#csv.reader
由于在文本模式下打開檔案會根據作業系統對核心代碼的處理方式進行不同的處理,是以CVS例程作者必須确定他們需要更多控制 - 他們更願意自己處理換行。這可能使他們能夠解決在另一個作業系統上建立的一個作業系統下處理檔案時遇到的不一緻問題 - 在某些特殊情況下,"文本讀取"會改變問題。它也可能沒有發現錯誤,但他們希望避免未來的可能性。或者,也可能是因為他們不得不處理換行注意事項,繞過文本處理可能會更快。
從邏輯上講,由于無法控制正在讀取的檔案的OS源,是以使用二進制檔案可能是更好的方法。但是,編寫一個文本檔案可能會很好地将其留給核心例程來使用文本模式處理目前作業系統的換行符。
在python檔案模式"w +"的困惑中讨論了"+"
我從來沒有收到過關于為什麼我不能在二進制模式下打開ascii檔案的好解釋。
我從未見過以二進制模式打開檔案來破壞資料。
我已經看到以ascii模式打開檔案,改變或損壞正在檢索的資料,我和我認為大多數經驗豐富的python程式員都會以二進制模式打開檔案,除非我們有某種保證,沒有,也永遠不會檔案中的二進制字元。
要了解原因,請寫open(binary.txt, wb).write(b"1
2
3
")和open(text.txt, w).write("1
2
3
")并嘗試在notepad.exe中打開這兩個檔案
因為notepad.exe太笨了以至于無法識别 n作為換行符,當它沒有前面時 r n對我來說不是一個很好的理由...如果我寫" n"我希望該檔案隻包含 n。 ..
通過在非Posix環境(如MSDOS和MS Windows)上使用t,
序列在輸入時轉換為(在輸出上轉換為相反的)。 b(二進制模式)不執行此類轉換。
據推測,CSV庫處理回車(可能在遇到它們時忽略它們)。
編輯:剛剛注意到一個改變的問題。
由于.CSV檔案并非真正供人類讀者使用,是以庫隻能使用(換行(LF)又名換行)分隔符輸出它們。他們唯一真正的缺點是MSWindows使用者用記事本打開檔案:它會顯示不佳。 CSV庫還可以輸出帶有
(CR LF)的檔案,因為大多數程式都符合MSDOS文本檔案約定。
無論哪種方式,庫都可以通過b(二進制)模式編寫。如果在t(文本)模式下打開,行分隔符可能會像
那樣略微奇怪。可能大多數CSV檔案解析器忽略CR,并将LF LF識别為結束一行并跟随一條空(空白)行,它也會忽略。
手冊頁中解釋了+:
w+ Open for reading and writing. The file is created if it does
not exist, otherwise it is truncated. The stream is
positioned at the beginning of the file.
差別在于w+允許讀寫,而w隻允許寫入。
可能通過使用它們作為行分隔符()...但是很好的答案
是否在文本模式下翻譯取決于平台(os.linesep)。它在Windows上。它不适用于OS X.您不需要顯式使用t模式(它在Python 2上傳遞給stdio函數,是以它可以啟用與平台相關的行為,例如将Ctrl + Z識别為輸入上的EOF字元)。 csv子產品始終在輸入時識别 r和 n