2010-10-26 109 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