Python file.write创build额外的回车

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

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,而不是像我所期望的那样。 为什么?

\n转换为os.linesep文件模式下打开的文件。 所以,当你把os.linesep写到os.linesep上的文本模式文件时,你写成\r\n ,并且\n得到转换,得到\r\r\n

另请参阅文档 :

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

文本文件在不同的操作系统上具有不同的行尾,但使用具有一致的行尾字符的字符串很方便。 如果需要的话,Python继承了使用'\n'作为通用行尾字符C的约定,并依靠文件读写功能进行转换。 如果文件以默认text模式打开,则读写功能知道这么做。 如果在打开文件时将b字符添加到模式字符串中,则会跳过该翻译。

用Python 3

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

传递一个空字符串参数newline=''将禁用翻译,保留新的行字符。 仅适用于文本模式。

从文档

在输出中,如果换行符是None,则写入的任何'\ n'字符将被转换为系统默认行分隔符os.linesep。 如果换行符是“”,则不会发生翻译。 如果换行符是任何其他合法值,则写入的任何“\ n”字符都将转换为给定的字符串。

适用于我:

 >>> 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是你的想法,等等?

请参阅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'或包含全部看到的换行符类型。