<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
我在讀pythoncsv模組檔案 看到了這樣一句話
如果 csvfile 是檔案物件,則開啟它時應使用 newline=‘’。
其備註:如果沒有指定 newline=‘’,則嵌入引號中的換行符將無法正確解析,並且在寫入時,使用 rn 換行的平臺會有多餘的 r 寫入。由於 csv 模組會執行自己的(通用)換行符處理,因此指定 newline=‘’ 應該總是安全的。
我就在思考open函數中的newline引數的作用,因為自己之前在使用open函數時從來沒有設定過newline引數,僅從上面官方給的備註理解newline引數可以幫助處理換行符解析的問題
並且查閱得知不同作業系統換行符並不一致:
Unix 的行結束約定 ‘n’、Windows 的約定 ‘rn’ 以及舊版 Macintosh 的約定 ‘r’
打破了我原本觀念以為的換行符就是n
python官方檔案對newline引數解釋:
newline 控制 universal newlines 模式如何生效(它僅適用於文字模式)。它可以是 None,‘’,‘n’,‘r’ 和 ‘rn’。它的工作原理:
從流中讀取輸入時,如果 newline 為 None,則啟用通用換行模式。輸入中的行可以以 ‘n’,‘r’ 或 ‘rn’ 結尾,這些行被翻譯成 ‘n’ 在返回呼叫者之前。如果它是 ‘’,則啟用通用換行模式,但行結尾將返回給呼叫者未翻譯。如果它具有任何其他合法值,則輸入行僅由給定字串終止,並且行結尾將返回給未呼叫的呼叫者。
將輸出寫入流時,如果 newline 為 None,則寫入的任何 ‘n’ 字元都將轉換為系統預設行分隔符 os.linesep。如果 newline 是 ‘’ 或 ‘n’,則不進行翻譯。如果 newline 是任何其他合法值,則寫入的任何 ‘n’ 字元將被轉換為給定的字串。
從這也就理解了為什麼原本使用open()寫的時候用n就可以表示換行以及讀文字檔案時行尾會返回n
回到上文,那為什麼在讀寫csv檔案時就要設定newline=''呢?
pythoncsv官方檔案解釋了這一問題(這也就引入了第二種方法解決換行的問題,我在後面會介紹到)
Dialect.lineterminator
放在 writer 產生的行的結尾,預設為 ‘rn’。
註解 reader 經過寫死,會識別 ‘r’ 或 ‘n’ 作為行尾,並忽略 lineterminator。未來可能會更改這一行為。
用白話說就是writerow()方法在寫入一行資料時在行尾都會跟一個預設換行符(rn)(即csv是將’一行資料rn’寫入記憶體,此時這一行資料還在記憶體中,還沒有寫入檔案)之後執行程式碼真正在向檔案寫入時根據不同newline引數進行翻譯
而在向txt檔案使用write()方法寫入內容時是我們手動新增換行符n(記憶體中的資料就是我們寫入的內容,並不會隱式新增其他內容)之後執行程式碼真正在向檔案寫入時根據newline引數進行翻譯,這就是二者的區別
具體流程:
newline=‘’
writer.writerow(‘line’) 實際是向記憶體中寫入’linern’ --》 執行程式碼,寫入檔案,根據newline=‘’,將不進行翻譯 --》檔案最終寫入’linern’
newline=None(預設)
f.write(‘linen’) 直接將’linen’寫入記憶體 --》 執行程式碼,寫入檔案,根據newline=None,將n翻譯為rn --》檔案最終寫入’linern’
case1: w newline=‘’ r newline=‘’
import csv with open("test.csv","w",encoding='utf-8',newline='') as csvfile: writer=csv.writer(csvfile) writer.writerow(["num","name","grade"]) writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']]) with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,gradern1,luke,96rn2,jack,85rn3,nick,84rn'
case2: w newline=‘r’ r newline=‘’
import csv with open("test.csv","w",encoding='utf-8',newline='r') as csvfile: writer=csv.writer(csvfile) writer.writerow(["num","name","grade"]) writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']]) with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderr1,luke,96rr2,jack,85rr3,nick,84rr'
case3: w newline=‘rn’ r newline=‘’
import csv with open("test.csv","w",encoding='utf-8',newline='rn') as csvfile: writer=csv.writer(csvfile) writer.writerow(["num","name","grade"]) writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']]) with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderrn1,luke,96rrn2,jack,85rrn3,nick,84rrn'
case4: w newline=None r newline=None
import csv with open("test.csv","w",encoding='utf-8',newline=None) as csvfile: writer=csv.writer(csvfile) writer.writerow(["num","name","grade"]) writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']]) with open("test.csv","r",encoding='utf-8',newline=None) as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,gradenn1,luke,96nn2,jack,85nn3,nick,84nn'
case5: 檔案寫入為rrn 檔案讀取 newline=‘r’
with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderrn1,luke,96rrn2,jack,85rrn3,nick,84rrn' import csv with open("test.csv","r",encoding='utf-8',newline='r') as csvfile: content = csv.reader(csvfile) for i in content: print(i)
為什麼會報錯:
csv.reader是如何讀取rrn的:讀取時遇到r認為一行結束了,再一次遇到r同樣認為一行結束(因而返回了空串列表),遇到n無法解釋–》報錯
case6:檔案寫入為rrn 檔案讀取 newline=‘n’
with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderrn1,luke,96rrn2,jack,85rrn3,nick,84rrn' import csv with open("test.csv","r",encoding='utf-8',newline='n') as csvfile: content = csv.reader(csvfile) for i in content: print(i)
case7:檔案寫入為rrn 檔案讀取newline=‘rn’
with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderrn1,luke,96rrn2,jack,85rrn3,nick,84rrn' import csv with open("test.csv","r",encoding='utf-8',newline='rn') as csvfile: content = csv.reader(csvfile) for i in content: print(i)
case8:檔案寫入為rr 檔案讀取 newline=‘r’
with open("test.csv","r",encoding='utf-8',newline='') as csvfile: txtdata=csvfile.read() txtdata #>>'num,name,graderr1,luke,96rr2,jack,85rr3,nick,84rr' import csv with open("test.csv","r",encoding='utf-8',newline='r') as csvfile: content = csv.reader(csvfile) for i in content: print(i)
第二種方法:通過設定csv.writer方法中的lineterminator引數
上面提到lineterminator引數控制writer寫入每一行後跟的隱式結束符,預設為’rn’,因此我們需要要設定lineterminator=‘n’,讀取時也不需要設定newline引數即可獲得想要的效果
import csv with open("test.csv","w",encoding='utf-8') as csvfile: writer=csv.writer(csvfile,lineterminator='n') writer.writerow(["num","name","grade"]) writer.writerows([[1,'luke','96'],[2,'jack','85'],[3,'nick','84']]) with open("test.csv","r",encoding='utf-8') as csvfile: lst=csv.reader(csvfile) csvfile.seek(0) txtdata = csvfile.read() csvfile.seek(0) for i in lst: print(i) txtdata #>>'num,name,graden1,luke,96n2,jack,85n3,nick,84n'
到此這篇關於python open函數中newline引數範例詳解的文章就介紹到這了,更多相關python open函數newline引數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45