Python file.write 产生多余的回车符
我正在用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\r\n,而不是我预期的\r\n。这是为什么呢?
5 个回答
7
文本文件在不同的操作系统上有不同的换行符,但为了方便处理,我们通常希望使用一致的换行符。Python 继承了 C 语言的习惯,使用 '\n'
作为通用的换行符,并依靠文件的读写功能来进行必要的转换。如果文件是以默认的 text
模式打开的,读写功能会自动处理这个转换。如果在打开文件时在模式字符串中加上 b
字符,那么这个转换就会被跳过。
19
在Python 3中,
open()
函数新增了一个参数newline
,这个参数可以让你指定一个字符串,用来替换所有的\n
。
如果你传入一个空字符串newline=''
,那么就不会进行替换,换行符会保持原样。这个设置只适用于文本模式。
在输出时,如果
newline
是None,那么写入的所有'\n'
字符都会被转换成系统默认的换行符,也就是os.linesep
。如果newline
是空字符串,那么就不会进行任何转换。如果newline
是其他合法值,那么写入的'\n'
字符会被转换成你指定的字符串。
49
\n
在以文本模式打开的文件中会被转换成 os.linesep
。所以,当你在Windows上向一个文本模式的文件写入 os.linesep
时,实际上写入的是 \r\n
,而 \n
会被转换成 \r\r\n
。
你可以查看 官方文档了解更多信息:
在以文本模式(默认模式)打开的文件中,不要使用 os.linesep 作为行结束符;在所有平台上,应该使用单个的 '\n'。