用Python编写的CSV文件在每行之间有空行

用Python编写的CSV文件在每行之间有空行,python,windows,csv,Python,Windows,Csv,此代码读取文件.csv,进行更改,并将结果写入文件1子部分 但是,当我在Microsoft Excel中打开生成的csv时,每条记录后面都有一个额外的空行 有没有办法让它不加一个空行?注意:这似乎不是首选的解决方案,因为在Windows系统上是如何添加额外的行的。如合同所述: 如果csvfile是一个文件对象,则必须在有区别的平台上使用“b”标志打开它 Windows就是这样一个平台,在这个平台上,这会产生不同。虽然正如我在下面描述的那样更改行终止符可能已经解决了这个问题,但通过以二进制模式打开

此代码读取文件.csv,进行更改,并将结果写入文件1子部分

但是,当我在Microsoft Excel中打开生成的csv时,每条记录后面都有一个额外的空行


有没有办法让它不加一个空行?

注意:这似乎不是首选的解决方案,因为在Windows系统上是如何添加额外的行的。如合同所述:

如果csvfile是一个文件对象,则必须在有区别的平台上使用“b”标志打开它

Windows就是这样一个平台,在这个平台上,这会产生不同。虽然正如我在下面描述的那样更改行终止符可能已经解决了这个问题,但通过以二进制模式打开文件,可以完全避免这个问题。有人可能会说,这个解决方案更“优雅”。“摆弄”行终止符可能会导致系统之间的代码不可移植,在这种情况下,在unix系统上以二进制模式打开文件不会产生任何效果。它产生了跨系统兼容的代码

发件人:

在Windows上,将“b”附加到模式 以二进制模式打开文件,因此 还有“rb”、“wb”等模式, 和“r+b”。Windows上的Python使 文本和二进制的区别 文件夹;中的行尾字符 文本文件会自动更改 在读取或写入数据时,会稍微改变。 这是对 文件数据适用于ASCII文本 文件,但它会损坏二进制数据 类似于JPEG或EXE文件。是 使用二进制模式时要非常小心 读写这样的文件。在…上 在Unix中,附加一个“b”并没有什么坏处 切换到模式,以便您可以使用它 独立于所有二进制文件的平台 档案

原件

作为csv.writer可选参数的一部分,如果要获得额外的空行,则可能必须更改lineterminator(信息)。下面的示例来自python页面,将其从“\n”更改为应为的内容。因为这只是对问题的暗中试探,这可能有效,也可能无效,但这是我最好的猜测

import csv

with open('thefile.csv', 'rb') as f:
  data = list(csv.reader(f))
  import collections
  counter = collections.defaultdict(int)

  for row in data:
        counter[row[10]] += 1


with open('/pythonwork/thefile_subset11.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    for row in data:
        if counter[row[10]] >= 504:
           writer.writerow(row)

在Python2中,用模式
'wb'
而不是
'w'
打开
outfile
csv.writer
\r\n
直接写入文件。如果不以二进制模式打开文件,它将写入
\r\n
,因为在Windows上,文本模式会将每个
\n
转换为
\r\n

在Python3中,所需的语法已更改(请参见下面的文档链接),因此使用附加参数
newline='
(空字符串)打开
outfile

示例: 文档链接

简单的答案是,csv文件应始终以二进制模式打开无论是输入还是输出,否则在Windows上都会出现行尾问题。特别是在输出时,csv模块将写入
\r\n
(标准csv行终止符),然后(在文本模式下),运行时将
\n
替换为
\r\n
(Windows标准行终止符),给出
\r\n
的结果


摆弄
行终止符不是解决方案。

在二进制模式“wb”下打开文件在Python 3+中不起作用。或者更确切地说,您必须在写入数据之前将其转换为二进制。那只是个麻烦

相反,您应该将其保持为文本模式,但将换行符改写为空。像这样:

# Python 2
with open('/pythonwork/thefile_subset11.csv', 'wb') as outfile:
    writer = csv.writer(outfile)

# Python 3
with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
    writer = csv.writer(outfile)

我正在为Python3编写这个答案w.r.t.,因为我最初遇到了同样的问题

我应该使用
PySerial
从arduino获取数据,并将其写入.csv文件中。在我的案例中,每次读取都以
'\r\n'
结束,所以换行符总是分隔每一行

在我的例子中,
newline='
选项不起作用。因为它显示了一些错误,比如:

with open('/pythonwork/thefile_subset11.csv', 'w', newline='') as outfile:
所以他们似乎不接受在这里省略新行

这里只看到一个答案,我在writer对象中提到了行终止符,比如

writer=csv.writer(csv_文件,分隔符='',行终止符='\r')


这对我跳过额外的换行符起到了作用。

使用Python3时,使用模块可以避免空行。如文档中所述,文件以二进制模式打开,因此不需要更改换行符kwarg。我最近遇到了同样的问题,这对我来说很有效:

with open('op.csv', 'a',newline=' ') as csv_file:

ValueError: illegal newline value: ''

使用下面定义的方法将数据写入CSV文件

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)
只需在
open
方法中添加一个额外的
newline='
参数:

open('outputFile.csv', 'a',newline='')
这将写入CSV行而不创建其他行

def writePhoneSpecsToCSV():
    rowData=["field1", "field2"]
    with open('outputFile.csv', 'a',newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(rowData)
“lineterminator='\r'”允许传递到下一行,两行之间没有空行。

借用,似乎最干净的解决方案是使用
io.TextIOWrapper
。我自己设法解决了这个问题,如下所示:

with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)
上述答案与Python2不兼容。为了具有兼容性,我想您只需要将所有写入逻辑包装在
if
块中:

from io import TextIOWrapper

...

with open(filename, 'wb') as csvfile, TextIOWrapper(csvfile, encoding='utf-8', newline='') as wrapper:
    csvwriter = csv.writer(wrapper)
    for data_row in data:
        csvwriter.writerow(data_row)
如果sys.version\u info<(3,):
#Python2处理CSV的方法
其他:
#上述逻辑

在最初的问题提出后的十年里,许多其他答案已经过时了。对于Python3,答案如下所示:

如果csvfile是文件对象,则应使用
newline=''

报告更详细地解释了:

如果未指定换行符='',则嵌入在带引号字段中的换行符将无法正确解释,并且在写入时使用换行符的平台上,\r\n将添加额外的换行符。指定换行符=''应该总是安全的,因为csv模块有自己的(通用)换行符处理


我正要发布这篇文章--lineterminator='\n'在一个简单的测试中为我工作。我能做什么
from io import TextIOWrapper

...

with open(filename, 'wb') as csvfile, TextIOWrapper(csvfile, encoding='utf-8', newline='') as wrapper:
    csvwriter = csv.writer(wrapper)
    for data_row in data:
        csvwriter.writerow(data_row)
if sys.version_info < (3,):
    # Python 2 way of handling CSVs
else:
    # The above logic