簡體   English   中英

為什么 Python file.write() 意外地在每一行添加一個換行符?

[英]Why does Python file.write() unexpectedly add a newline to every line?

我想在循環期間將字符串寫入文件:

with open("dump.txt", "w+") as file:
    for x in range(1, 10):
        file.write(str(x) + "\r\n")

如果我在 Windows 上的記事本中打開dump.txt ,我會得到我所期望的:

1
2
3
4
5
6
7
8
9

我必須在每一行的末尾添加\r\n ,否則我會得到123456789 (一行中的所有數字)。

當我在 Notepad++ 中檢查我的dump.txt時,我可以看到在每一行之后我都會得到一個額外的 CRLF:

1 CRLF
CRLF
2 CRLF
CRFL
etc.

當我將dump.txt讀回 python 並遍歷文件時,額外的 LF 是 output:

import sys

with open("dump.txt", "r") as infile:
    for line in infile:
         sys.stdout.write(line)

C:\...\Python\Python38-32\python.exe C:/.../script.py
1

2

3

如果我在 Windows 上使用記事本創建一個新文件並輸入數字 1 到 9,在每行后按回車,python 會正確讀取它。 在 Notepad++ 中,我也看不到任何額外的 CRLF 字符。

import sys 

with open("dump2.txt", "r") as infile:
    for line in infile:
         sys.stdout.write(line)

C:\...\Python\Python38-32\python.exe C:/.../script2.py
1
2
3
...
9

我的問題是:我在這里錯過了什么? Python 似乎在每個 file.write() 中添加了第二個 CRLF,但前提是要寫入的字符串已經以"\r\n"結尾。 這是一個非常奇怪的行為。

我想逐行編寫我的字符串,或者以我的顯式“\r\n”結尾,或者更好地使用運行腳本的平台的 EOL 字符,就像我剛剛使用手動創建一個 txt 文件一樣記事本..

非常感謝您的幫助!

Notepad ++ 中的 CRLF 表示“回車”,或者在 Python 中表示\r 如果您想在寫入時刪除它們,則只需輸入\n即可。

Python 使用從 C 繼承的約定,即內部換行符始終是單個 LF(有時寫為 \n),無論平台約定是什么。 當一個文件以文本模式打開時,這是默認的,數據會在寫入/讀取時自動轉換為平台標准/從平台標准轉換。

您在 Windows 上,其中行尾約定是 CR+LF。 當您編寫 '\r\n'(即 CR + LF)時,它會轉換為 CR + CR + LF。 當你讀回來時,CR+LF 對被轉換為 LF,而“單獨的”CR:s 也被轉換為 LF:s!

如需更多閱讀,請從open function 的文檔開始,然后點擊鏈接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM