我正在使用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'或包含全部看到的换行符类型。