2010-10-26 106 views
9

我正在使用python將一系列SQL語句寫入文件。模板字符串看起來像:Python file.write創建額外的回車

store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)' 

我寫像這樣的文件:

for line in source: 
    line = line.rstrip() 
    fields = line.split('\t') 
    script.write(store_insert % tuple(fields)) 
    script.write(os.linesep) 

然而,輸出結果中,我看到\ r \ r \ n在每個月底線,而不是我所期望的\ r \ n。爲什麼?

+1

'%'字符串格式化現在是舊的;首選成語是'str.format' =) – katrielalex 2010-10-26 16:37:06

+4

你是用文本還是二進制模式打開文件?你在使用哪種操作系統? – AndiDog 2010-10-26 16:39:35

+0

Windows,我只是做了一個打開(文件,'r') – Chris 2010-10-26 16:45:35

回答

20

\n對於以文本模式打開的文件轉換爲os.linesep。因此,當您將os.linesep寫入Windows上的文本模式文件時,可以編寫\r\n,並且\n轉換成\r\r\n

the docs參見:

不要寫在文本模式(默認)打開文件時使用os.linesep作爲行終止;在所有平臺上使用單個'\ n'。

+0

+1找到了!這實際上並沒有發生在我身上(Win7),也許這是一個與Windows有關的事情? – katrielalex 2010-10-26 17:00:41

+0

我也在使用Windows 7,但這解釋了它。 +1並回答! – Chris 2010-10-26 17:06:25

0

看到open()DOC:

除了標準fopen()函數值模式可以是 'U' 或 '的rU'。 Python通常使用通用的新行支持來構建;提供'U'作爲文本文件打開文件,但行可以通過以下任何一種方式終止:Unix行尾約定'\ n',Macintosh約定'\ r'或Windows約定'\ n' r \ N」。所有這些外部表示被Python程序視爲'\ n'。如果Python沒有通用的新行支持,那麼'U'模式與普通文本模式相同。請注意,如此打開的文件對象也有一個名爲newlines的屬性,它的值爲None(如果還沒有看到換行符),'\ n','\ r','\ r \ n'或包含全部看到的換行符類型。

+0

那又如何?通用換行模式僅供閱讀。 – AndiDog 2010-10-26 16:38:37

+0

@AndiDog:我認爲他說的是,當他在寫完文件後打開一個文件('','r')時,他看到\ r \ r \ n,他認爲他只寫了' \ r \ n'(windows),所以我告訴他,當他打開他的文件時,open()會自動將\ r \ n添加到他的數據中,所以'\ r \ n'+'\ r \ n'=' \ r \ r \ n','\ n'會被移除,您是否希望我詳述更多? – mouad 2010-10-26 16:52:31

+1

不,我實際上使用打開的另一個輸出文件(文件,'w')。更改爲打開(文件,'wb')修復了這個問題,但我並不完全確定我明白爲什麼 – Chris 2010-10-26 16:53:34

1

工作對我來說:

>>> import tempfile 
>>> tmp = tempfile.TemporaryFile(mode="w+") 
>>> store_insert = '\tinsert stores (storenum, ...) values (\'%s\', ...)' 
>>> lines = ["foo\t\t"] 
>>> for line in lines: 
...  line = line.rstrip() 
...  fields = line.split("\t") 
...  tmp.write(store_insert % tuple(fields)) 
...  tmp.write(os.linesep) 
... 
>>> tmp.seek(0) 
>>> tmp.read() 
"\tinsert stores (storenum, ...) values ('foo', ...)\r\n" 

你確定這是一個正在運行的代碼,即os.linesep是你認爲它是等?

3

文本文件在不同的操作系統上具有不同的行尾,但使用具有一致行結束字符的字符串很方便。 Python繼承了使用'\n'的C作爲通用行尾字符的約定,並且在必要時依靠文件讀寫功能進行轉換。如果文件以默認的text模式打開,則讀寫功能知道這麼做。如果在打開文件時將b字符添加到模式字符串中,則會跳過該翻譯。

3

使用Python 3

os.open()引入了新的參數newline,允許指定的\n任何發生將被轉換爲字符串。

傳遞一個空字符串參數newline=''會禁用翻譯,讓新的行字符保持原樣。僅適用於文本模式。

From the documentation

在輸出時,如果新行是無,任何 '\ n' 字符寫入是 翻譯系統默認行分隔,os.linesep。如果 換行符是'',則不會發生翻譯。如果換行符是 其他合法值中的任何一個,則寫入的任何'\ n'字符將被轉換爲給定字符串的 。

+0

有關用例和一些闡述,請參閱[這裏](http://stackoverflow.com/questions/43528959/python-3-how-to-pass-binary-file-as-text-without-saving-first) – RolfBly 2017-04-21 19:35:35