我正在使用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。为什么呢?
答案 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不变。仅适用于文本模式。
在输出时,如果换行是无,则任何' \ 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
是你认为的那样吗?