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