22

我正在使用 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。为什么?

4

5 回答 5

43

\n转换为os.linesep以文本模式打开的文件。因此,当您os.linesep在 Windows 上写入文本模式文件时,您写入\r\n,然后\n转换为\r\r\n.

另请参阅文档

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

于 2010-10-26T16:57:47.477 回答
15

使用 Python 3

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

传递一个空字符串参数newline=''会禁用翻译,让新行 char 保持原样。仅对文本模式有效。

从文档

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

于 2016-12-20T17:25:09.990 回答
6

文本文件在不同的操作系统上具有不同的行尾,但使用具有一致行尾字符的字符串会很方便。Python 从 C 继承了使用'\n'通用行结束字符的约定,并在必要时依靠文件读取和写入函数进行转换。text如果文件以默认模式打开,则读取和写入函数知道执行此操作。如果您b在打开文件时将字符添加到模式字符串,则会跳过此翻译。

于 2010-10-26T17:04:09.827 回答
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你认为它是这样的吗?

于 2010-10-26T16:45:01.320 回答
1

请参阅open () 文档:

除了标准的 fopen() 值模式之外,模式还可以是“U”或“rU”。Python 通常是用通用换行支持构建的;提供 'U' 将文件作为文本文件打开,但行可能被以下任何一种终止:Unix 行尾约定 '\n'、Macintosh 约定 '\r' 或 Windows 约定 '\ r\n'。所有这些外部表示都被 Python 程序视为“\n”。如果 Python 是在没有通用换行支持的情况下构建的,则带有“U”的模式与普通文本模式相同。请注意,如此打开的文件对象还有一个名为 newlines 的属性,其值为 None(如果尚未看到换行符)、'\n'、'\r'、'\r\n' 或包含所有看到的换行符类型。

于 2010-10-26T16:35:26.283 回答