Python file.write 产生多余的回车符

25 投票
5 回答
42430 浏览
提问于 2025-04-16 06:06

我正在用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'。

撰写回答