Python open函數newline=''參數理解
1、背景
Python open()函數里面的newline參數不怎么理解,查閱了蠻多資料,最終我看到了簡書上的這篇文章。
光看也看不明白,於是我便進行了如下實驗。
2、實驗
2.1、寫文件、讀文件都帶上newline=''
# 調用csv模塊。
import csv
# 以只寫模式打開文件test01.csv文件,若文件不存在,則新建;文件存在,則覆蓋。
with open('test01.csv','w',newline='') as file:
# writer()函數返回一個 writer 對象,該對象負責將用戶的數據在給定的文件類對象上轉換為帶分隔符的字符串。
writer=csv.writer(file)
# csv writer.writerow(row)將row 形參寫入到 writer 的文件對象。
writer.writerow('a')
writer.writerow('b')
# 以只讀的方式打開test01.csv文件。
with open('test01.csv','r',newline='') as file:
# read()方法用於從文件讀取指定的字節數,如果未給定或為負則讀取所有。
content=file.read()
# 打印內容。
print(content)
運行結果:

添加斷點,啟動調試,可以看到變量content的值為'a\r\nb\r\n'。

2.2、寫文件帶上參數newline='',讀文件不帶參數
# 調用csv模塊。
import csv
# 以只寫模式打開文件test02.csv文件,若文件不存在,則新建;文件存在,則覆蓋。
with open('test02.csv','w',newline='') as file:
# writer()函數返回一個 writer 對象,該對象負責將用戶的數據在給定的文件類對象上轉換為帶分隔符的字符串。
writer=csv.writer(file)
# csv writer.writerow(row)將row 形參寫入到 writer 的文件對象。
writer.writerow('a')
writer.writerow('b')
# 以只讀的方式打開test02.csv文件。
with open('test02.csv','r') as file:
# read()方法用於從文件讀取指定的字節數,如果未給定或為負則讀取所有。
content=file.read()
# 打印內容。
print(content)
運行結果:

添加斷點,啟動調試,可以看到變量content的值為'a\nb\n'。

2.3、寫文件不帶參數,讀文件帶參數newline=''
# 調用csv模塊。
import csv
# 以只寫模式打開文件test03.csv文件,若文件不存在,則新建;文件存在,則覆蓋。
with open('test03.csv','w') as file:
# writer()函數返回一個 writer 對象,該對象負責將用戶的數據在給定的文件類對象上轉換為帶分隔符的字符串。
writer=csv.writer(file)
# csv writer.writerow(row)將row 形參寫入到 writer 的文件對象。
writer.writerow('a')
writer.writerow('b')
# 以只讀的方式打開test03.csv文件。
with open('test03.csv','r',newline='') as file:
# read()方法用於從文件讀取指定的字節數,如果未給定或為負則讀取所有。
content=file.read()
# 打印內容。
print(content)
運行結果:

添加斷點,啟動調試,可以看到變量content的值為'a\r\r\nb\r\r\n'。

2.4、寫文件、讀文件都不帶參數newline=''
# 調用csv模塊。
import csv
# 以只寫模式打開文件test04.csv文件,若文件不存在,則新建;文件存在,則覆蓋。
with open('test04.csv','w') as file:
# writer()函數返回一個 writer 對象,該對象負責將用戶的數據在給定的文件類對象上轉換為帶分隔符的字符串。
writer=csv.writer(file)
# csv writer.writerow(row)將row 形參寫入到 writer 的文件對象。
writer.writerow('a')
writer.writerow('b')
# 以只讀的方式打開test04.csv文件。
with open('test04.csv','r') as file:
# read()方法用於從文件讀取指定的字節數,如果未給定或為負則讀取所有。
content=file.read()
# 打印內容。
print(content)
運行結果:

添加斷點,啟動調試,可以看到變量content的值為'a\n\nb\n\n'。

3、說明
下面4張圖片選自Python官方文檔。

圖一

圖二

圖三

圖四
| 序號 | 說明 | 結果 |
|---|---|---|
| 實驗一 | 寫文件、讀文件都帶上newline='' | a\r\nb\r\n |
| 實驗二 | 寫文件帶上參數newline='',讀文件不帶參數 | a\nb\n |
| 實驗三 | 寫文件不帶參數,讀文件帶參數newline='' | a\r\r\nb\r\r\n |
| 實驗四 | 寫文件、讀文件都不帶參數newline='' | a\n\nb\n\n |
由圖三、圖四可知:
- 如果寫文件時,未指定newline參數,則將'\n'轉換為系統默認行分隔符,又由圖二可知,Windows系統默認的行分隔符為'\r\n'。即寫文件時,未指定newline參數,則'\n'會轉換為'\r\n'。【注:第二部分實驗的操作系統為Windows】
- 如果讀文件時,未指定newline參數,則'\r'、'\r\n'都會轉換為'\n'。
- 寫文件、讀文件時,指定了newline='',不會發生轉換。
由實驗一的結果可推斷出:
- csv模塊中的writerow()方法在寫文件時會加入'\r\n'作為換行符。【寫文件、讀文件都指定了newline='',不會發生轉換,因此可以推斷出writerow()方法會在寫文件時加入'\r\n'作為換行符。】
實驗一:
csv模塊中的writerow()方法在寫文件時會加入'\r\n'作為換行符。寫文件的時候,指定newline='',因此寫入文件的數據不會發生替換,即寫入文件的數據為'a\r\nb\r\n';與此同時,讀文件的時候,指定了newline='',因此讀出的數據不會發生轉換。因此結果為'a\r\nb\r\n'。
實驗二:
csv模塊中的writerow()方法在寫文件時會加入'\r\n'作為換行符。寫文件的時候,指定newline='',因此寫入文件的數據不會發生替換,即寫入文件的數據為'a\r\nb\r\n';讀文件的時候,未指定newline='',因此'\r'、'\r\n'都會轉換為'\n',即文件中的'\r\n'會被替換'\n'放入緩沖區。因此結果為'a\nb\n'。
實驗三:
csv模塊中的writerow()方法在寫文件時會加入'\r\n'作為換行符。寫文件的時候,未指定newline='',此時'\n'會轉換為'\r\n',即寫入文件的數據由'a\r\nb\r\n'轉為'a\r\r\nb\r\r\n'。讀文件的時候,指定了newline='',因此讀出的數據不會發生轉換。因此結果為'a\r\r\nb\r\r\n'。
實驗四:
csv模塊中的writerow()方法在寫文件時會加入'\r\n'作為換行符。寫文件的時候,未指定newline='',此時'\n'會轉換為'\r\n',即寫入文件的數據由'a\r\nb\r\n'轉為'a\r\r\nb\r\r\n'。讀文件的時候,未指定newline='','\r'、'\r\n'都會轉換為'\n',因此'a\r\r\nb\r\r\n'中的尾部'\r\n'被替換成'\n';第一個'\r'替換為'\n',因此結果為'a\n\nb\n\n'。
