706 Stimmen

Mit Python geschriebene CSV-Datei hat Leerzeilen zwischen den einzelnen Zeilen

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)

Dieser Code lautet thefile.csv ein, nimmt Änderungen vor und schreibt die Ergebnisse in thefile_subset1 .

Wenn ich jedoch die resultierende csv-Datei in Microsoft Excel öffne, gibt es nach jedem Datensatz eine zusätzliche Leerzeile!

Gibt es eine Möglichkeit, dass keine zusätzliche Leerzeile eingefügt wird?

8voto

Febin Mathew Punkte 854

Verwenden Sie die unten definierte Methode, um Daten in die CSV-Datei zu schreiben.

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

Fügen Sie einfach eine zusätzliche newline='' Parameter innerhalb der open Methode:

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

Dadurch werden CSV-Zeilen geschrieben, ohne zusätzliche Zeilen zu erzeugen!

5voto

SheRa Punkte 39
with open(destPath+'\\'+csvXML, 'a+') as csvFile:
    writer = csv.writer(csvFile, delimiter=';', lineterminator='\r')
    writer.writerows(xmlList)

Der "Linienterminator=' \r '" erlauben den Übergang zur nächsten Zeile, ohne dass eine leere Zeile zwischen den beiden liegt.

4voto

Debanjan Dey Punkte 103

Ich schreibe diese Antwort in Bezug auf Python 3, da ich anfangs das gleiche Problem hatte.

Ich sollte Daten vom Arduino erhalten, indem ich PySerial und schreiben sie in eine .csv-Datei. Jedes Lesen endete in meinem Fall mit '\r\n' , so dass jede Zeile immer durch einen Zeilenumbruch getrennt wurde.

In meinem Fall, newline='' Option nicht funktioniert hat. Denn es zeigte einige Fehler wie:

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

ValueError: illegal newline value: ''

Es scheint also, dass sie das Weglassen des Zeilenumbruchs hier nicht akzeptieren.

In einer der Antworten, die ich hier gesehen habe, habe ich den Zeilenabschluss im Writer-Objekt erwähnt, etwa so,

writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')

und das hat bei mir funktioniert, um die zusätzlichen Zeilenumbrüche zu überspringen.

2voto

phantom-99w Punkte 860

Ausleihen von diese Antwort scheint es die sauberste Lösung zu sein, wenn man io.TextIOWrapper . Ich habe dieses Problem für mich wie folgt lösen können:

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)

Die obige Antwort ist nicht kompatibel mit Python 2. Um Kompatibilität zu erreichen, müsste man wohl einfach die gesamte Schreiblogik in eine if Block:

if sys.version_info < (3,):
    # Python 2 way of handling CSVs
else:
    # The above logic

0voto

Golden Lion Punkte 2590

Ich habe writerow verwendet.

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)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X