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)

这段代码读取file.csv,进行修改,并将结果写入到file_subset1。

然而,当我在Microsoft Excel中打开结果csv时,每条记录后都有一个额外的空行!

有没有办法让它不放额外的空行?


当前回答

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

open('outputFile.csv', 'a',newline='')

只需在open方法中添加一个额外的newline= "参数:

def writePhoneSpecsToCSV():
    rowData=["field1", "field2"]
    with open('outputFile.csv', 'a',newline='') as csv_file:
        writer = csv.writer(csv_file)
        writer.writerow(rowData)

这将写入CSV行,而无需创建额外的行!

其他回答

从最初的问题开始的十年里,许多其他的答案都已经过时了。对于Python3,答案在文档中是正确的:

如果csvfile是一个文件对象,它应该用newline= "

脚注更详细地解释了:

如果没有指定newline= ",则内嵌在带引号字段中的换行符将不能被正确解释,并且在write时使用\r\n linend的平台上将添加一个额外的\r。指定newline= "应该总是安全的,因为csv模块有自己的(通用的)换行处理。

csv。Writer模块直接控制行结束符,并直接将\r\n写入文件。在python3中,该文件必须以非翻译文本模式打开,参数为'w', newline= "(空字符串),否则在Windows上将写入\r\r\n,其中默认文本模式将每个\n转换为\r\n。

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

在Python 2中,使用二进制模式以'wb'而不是'w'模式打开outfile,以防止Windows换行符转换。Python 2在Unicode方面也有问题,需要其他变通方法来编写非ascii文本。如果你必须处理在Python 2上将Unicode字符串写入csv,请参阅下面的Python 2链接以及页面末尾的unicoderreader和UnicodeWriter示例,或者查看第三方unicodecsv模块:

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

文档链接

https://docs.python.org/3/library/csv.html#csv.writer https://docs.python.org/2/library/csv.html#csv.writer

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

如果csvfile是一个文件对象,在不同的平台上,它必须用' b '标志打开。

Windows is one such platform where that makes a difference. While changing the line terminator as I described below may have fixed the problem, the problem could be avoided altogether by opening the file in binary mode. One might say this solution is more "elegent". "Fiddling" with the line terminator would have likely resulted in unportable code between systems in this case, where opening a file in binary mode on a unix system results in no effect. ie. it results in cross system compatible code.

来自Python文档:

On Windows, 'b' appended to the mode opens the file in binary mode, so there are also modes like 'rb', 'wb', and 'r+b'. Python on Windows makes a distinction between text and binary files; the end-of-line characters in text files are automatically altered slightly when data is read or written. This behind-the-scenes modification to file data is fine for ASCII text files, but it’ll corrupt binary data like that in JPEG or EXE files. Be very careful to use binary mode when reading and writing such files. On Unix, it doesn’t hurt to append a 'b' to the mode, so you can use it platform-independently for all binary files.

原:

作为csv可选参数的一部分。如果你得到额外的空行,你可能不得不改变行结束符(信息这里)。下面的例子改编自python页面csv docs。把“\n”改成它应该是什么样子。因为这只是在黑暗中对问题的一种尝试,这可能行得通,也可能行不通,但这是我最好的猜测。

>>> import csv
>>> spamWriter = csv.writer(open('eggs.csv', 'w'), lineterminator='\n')
>>> spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
>>> spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])

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

with codecs.open( csv_file,  mode='w', encoding='utf-8') as out_csv:
     csv_out_file = csv.DictWriter(out_csv)

我使用writerow

def write_csv(writer, var1, var2, var3, var4):
    """
    write four variables into a csv file
    """
    writer.writerow([var1, var2, var3, var4])      
        
numbers=set([1,2,3,4,5,6,7,2,4,6,8,10,12,14,16])
rules = list(permutations(numbers, 4))
#print(rules)
selection=[]
with open("count.csv", 'w',newline='') as csvfile:
    writer = csv.writer(csvfile)

    for rule in rules:
        number1,number2,number3,number4=rule
        if ((number1+number2+number3+number4)%5==0):
            #print(rule)
            selection.append(rule)
            write_csv(writer,number1,number2,number3,number4)