Python file.write创建额外的回车

时间:2010-10-26 16:31:17

标签: python windows eol

我正在使用python将一系列SQL语句写入文件。模板字符串如下所示:

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 \ n \ r \ n在每一行的末尾,而不是我期望的\ r \ n。为什么呢?

5 个答案:

答案 0 :(得分:27)

对于以文本模式打开的文件,

\n转换为os.linesep。因此,当您在Windows上将os.linesep写入文本模式文件时,您编写\r\n,并\n转换为\r\r\n

另见the docs

  

在编写以文本模式打开的文件时,不要使用os.linesep作为行终止符(默认值);在所有平台上使用单个'\ n'。

答案 1 :(得分:7)

使用Python 3

os.open()引入了新参数newline,允许指定任何\n出现的字符串。

传递一个空字符串参数newline=''会禁用转换,保留新行char不变。仅适用于文本模式。

From the documentation

  

在输出时,如果换行是无,则任何' \ n'写的字符是   转换为系统默认行分隔符,os.linesep。如果   换行是''没有翻译。如果换行是任何一个   其他合法价值观,任何' \ n'写的字符被翻译成   给定字符串。

答案 2 :(得分:3)

文本文件在不同的操作系统上具有不同的行结尾,但使用具有一致行结束字符的字符串很方便。 Python继承了C的约定,即使用'\n'作为通用行结束字符,并依赖文件读写函数进行转换(如有必要)。如果文件是以默认的text模式打开的,则读写函数可以执行此操作。如果在打开文件时将b字符添加到模式字符串,则会跳过此转换。

答案 3 :(得分:1)

请参阅open()doc:

除了标准的fopen()值模式可能是'U'或'rU'。 Python通常使用通用换行支持构建;提供'U'将文件作为文本文件打开,但行可以通过以下任何一种方式终止:Unix行尾约定'\ n',Macintosh约定'\ r'或Windows约定'\ r \ N”。所有这些外部表示都被Python程序视为'\ n'。如果在没有通用换行符支持的情况下构建Python,则具有“U”的模式与普通文本模式相同。请注意,如此打开的文件对象也有一个名为newlines的属性,其值为None(如果尚未看到换行符),'\ n','\ r','\ r \ n'或包含所有元组的元组看到的新行类型。

答案 4 :(得分: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是你认为的那样吗?