Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python file.write创建额外的回车符_Python_Windows_Eol - Fatal编程技术网

Python file.write创建额外的回车符

Python file.write创建额外的回车符,python,windows,eol,Python,Windows,Eol,我正在使用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)) scrip

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

参见()文档:

除了标准的fopen()值之外,模式可以是“U”或“rU”。Python通常使用通用换行符支持构建;提供“U”将以文本文件的形式打开文件,但行可能会被以下任何一种方式终止:Unix行尾约定“\n”、Macintosh约定“\r”或Windows约定“\r\n”。Python程序将所有这些外部表示形式都视为“\n”。如果Python是在没有通用换行符支持的情况下构建的,则带有“U”的模式与普通文本模式相同。请注意,这样打开的文件对象还有一个名为“换行符”的属性,该属性的值为“无”(如果尚未看到换行符),“\n”、“r”、“r\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
就是您所认为的,等等?

\n
对于以文本模式打开的文件转换为
os.linesep
。因此,当您将
os.linesep
写入Windows上的文本模式文件时,您将写入
\r\n
,而
\n
将被转换,从而产生
\r\n

另见:

写入以文本模式打开的文件时,不要将os.linesep用作行终止符(默认设置);在所有平台上改用单个“\n”


文本文件在不同的操作系统上有不同的行尾,但使用具有一致行尾字符的字符串很方便。Python继承了C的惯例,即使用
'\n'
作为通用行结束符,并在必要时依赖文件读写函数进行转换。如果文件是在默认的
text
模式下打开的,则读写功能会执行此操作。如果在打开文件时将
b
字符添加到模式字符串中,将跳过此转换。

使用Python 3

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

传递空字符串参数
newline=''
将禁用转换,保留新行字符原样。仅对文本模式有效

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


%
字符串格式现在很旧;首选习惯用法是
str.format
=)您是以文本模式还是二进制模式打开文件的?您使用的是哪个操作系统?Windows,我刚刚打开了(文件,'r')哦,对于我打开的输出文件(输出文件,'w'),好的,我使用“打开(文件,'wb')”打开了文件(对于二进制模式),这解决了问题。当文件以文本模式打开时,python为什么要将我的\r\n转换为\r\n?@AndiDog:我想他说的是,当他用open(“”,'r')打开一个文件时,当他在上面写了之后,他看到了\r\r\n,他认为他只写了'\r\n'(windows),所以我告诉他,当他打开文件时,open()会自动添加到他的数据中,所以“\r\n”+”\r\n“=”\r\r\n“,删除了“\n”\r\n,您想让我详细说明一下吗???不,我实际上使用的是一个单独的输出文件,该文件是用open打开的(文件“w”)。更改为打开(文件“wb”)解决了这个问题,但我不完全明白为什么+1很好地找到了!这在我(Win7)身上并没有发生,也许这是一个依赖Windows的东西?我也在使用Windows 7,但这就是原因+1回答!有关用例和一些详细说明,请参见操作系统。open没有换行符参数<但是,代码>打开不会<但是,code>os.open有一个
O_BINARY
标志,它做同样的事情。