python2打开文件_关于python:何时以二进制模式打开文件(b)?
我注意到在文檔中他們總是用'wb'打開一個CSV文件。 為什么'b'? 我知道b代表二進制模式,但是你什么時候使用二進制模式(我猜想CSV文件不是二進制模式)。 如果相關(guān)我是從arcpy.da.SearchCursor()查詢的結(jié)果寫入CSV
編輯:根據(jù)這個答案注意到wb+用于編寫二進制文件。 什么包括+呢?
如果有任何非ascii字符你應(yīng)該使用二進制模式...在二進制模式下打開將永遠不會改變或損害你的數(shù)據(jù)afaik,但有時打開ascii模式將刪除或更改字符...因此我總是打開 二進制模式(即使使用ascii數(shù)據(jù))
@JoranBeasley:沒有"ascii模式"這樣的東西。 改為使用術(shù)語"文本模式"(文本文件的字符編碼可以是任何東西)。
閱讀您已鏈接的問題的答案 - +表示您希望同時寫入和從文件中讀取。
使用'b'模式,按原樣讀取/寫入二進制數(shù)據(jù),無需進行任何轉(zhuǎn)換,例如將換行符轉(zhuǎn)換為特定于平臺的值或使用字符編碼對文本進行解碼/編碼。
csv模塊很特別。 csv數(shù)據(jù)是文本,因此可以預(yù)期文本模式,但csv模塊默認使用'
'來終止所有平臺上的行,并且它始終將'
'和'
'都識別為換行符。 如果您在文本模式下打開相應(yīng)的文件(使用通用換行符),那么您將在Windows上獲得'
'(損壞的換行符)(os.linesep == '
')。 這就是Python 2文檔說你必須使用二進制模式的原因。 在Python 3中,使用了文本模式,但是您應(yīng)該傳遞newline=''以禁用通用換行模式。
如果要保留字段中嵌入的可能換行符(例如'
'),您還需要禁用通用換行符。
要挑剔,傳遞newline=不會禁用通用換行模式。從文檔:"如果是,啟用通用換行模式,但行結(jié)尾返回給調(diào)用者未翻譯。"
文件打開默認是使用文本模式,它可以在寫入時將" n"字符轉(zhuǎn)換為特定于平臺的表示,并在讀取時返回。
在Windows中,這將修改從' n'到' r n'的換行符,這將在其他應(yīng)用程序/平臺中打開CSV文件時出現(xiàn)問題。
因此,在打開二進制文件時,您應(yīng)該將'b'附加到模式值以在二進制模式下打開文件,這將提高可移植性。在沒有這種區(qū)別的系統(tǒng)上,添加"b"無效。
注意:'w +'截斷文件。
模式'r +','w +'和'a +'打開文件進行更新(讀寫)。
詳情如下:https://docs.python.org/2/library/functions.html#open
什么是"截斷"文件,是否意味著替換?
相反。文本模式提高了代碼的可移植性(您可以讀取在其他平臺上編寫的文本,本地編寫的文件可以通過特定于平臺的程序(如notepad.exe)來理解)。 csv是一種特殊情況,其中二進制模式用于文本數(shù)據(jù)
截斷表示如果文件不存在則會創(chuàng)建該文件,如果文件存在則會被覆蓋。所以是的,簡單來說就意味著取代。
我同意,"文本模式增加了可移植性,而csv只是一種特殊情況,其中二進制模式用于文本數(shù)據(jù)"。
特別是對于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
由于在文本模式下打開文件會根據(jù)操作系統(tǒng)對核心代碼的處理方式進行不同的處理,因此CVS例程作者必須確定他們需要更多控制 - 他們更愿意自己處理換行。這可能使他們能夠解決在另一個操作系統(tǒng)上創(chuàng)建的一個操作系統(tǒng)下處理文件時遇到的不一致問題 - 在某些特殊情況下,"文本讀取"會改變問題。它也可能沒有發(fā)現(xiàn)錯誤,但他們希望避免未來的可能性。或者,也可能是因為他們不得不處理換行注意事項,繞過文本處理可能會更快。
從邏輯上講,由于無法控制正在讀取的文件的OS源,因此使用二進制文件可能是更好的方法。但是,編寫一個文本文件可能會很好地將其留給核心例程來使用文本模式處理當前操作系統(tǒng)的換行符。
在python文件模式"w +"的困惑中討論了"+"
我從來沒有收到過關(guān)于為什么我不能在二進制模式下打開ascii文件的好解釋。
我從未見過以二進制模式打開文件來破壞數(shù)據(jù)。
我已經(jīng)看到以ascii模式打開文件,改變或損壞正在檢索的數(shù)據(jù),我和我認為大多數(shù)經(jīng)驗豐富的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環(huán)境(如MSDOS和MS Windows)上使用t,
序列在輸入時轉(zhuǎn)換為(在輸出上轉(zhuǎn)換為相反的)。 b(二進制模式)不執(zhí)行此類轉(zhuǎn)換。
據(jù)推測,CSV庫處理回車(可能在遇到它們時忽略它們)。
編輯:剛剛注意到一個改變的問題。
由于.CSV文件并非真正供人類讀者使用,因此庫只能使用(換行(LF)又名換行)分隔符輸出它們。他們唯一真正的缺點是MSWindows用戶用記事本打開文件:它會顯示不佳。 CSV庫還可以輸出帶有
(CR LF)的文件,因為大多數(shù)程序都符合MSDOS文本文件約定。
無論哪種方式,庫都可以通過b(二進制)模式編寫。如果在t(文本)模式下打開,行分隔符可能會像
那樣略微奇怪。可能大多數(shù)CSV文件解析器忽略CR,并將LF LF識別為結(jié)束一行并跟隨一條空(空白)行,它也會忽略。
手冊頁中解釋了+:
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.
區(qū)別在于w+允許讀寫,而w只允許寫入。
可能通過使用它們作為行分隔符()...但是很好的答案
是否在文本模式下翻譯取決于平臺(os.linesep)。它在Windows上。它不適用于OS X.您不需要顯式使用t模式(它在Python 2上傳遞給stdio函數(shù),因此它可以啟用與平臺相關(guān)的行為,例如將Ctrl + Z識別為輸入上的EOF字符)。 csv模塊始終在輸入時識別 r和 n
總結(jié)
以上是生活随笔為你收集整理的python2打开文件_关于python:何时以二进制模式打开文件(b)?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓和苹果系统的区别(安卓和苹果系统)
- 下一篇: python卸载module_Pytho