Dlaczego plik CSV zawiera pustą linię pomiędzy każdą linią danych podczas wyprowadzania z dyktafonu w Pythonie [duplikat]

To pytanie ma już odpowiedź tutaj:

Używam dyktafonu do wysyłania danych ze słownika do pliku csv. Dlaczego plik CSV ma pustą linię między każdą linią danych? Nie jest to wielka sprawa, ale mój zbiór danych jest duży i nie mieści się w jednym pliku csv, ponieważ ma zbyt wiele linii, ponieważ "podwójne odstępy" podwaja liczbę linii w pliku.

Mój kod do pisania do słownika to:

headers=['id', 'year', 'activity', 'lineitem', 'datum']
output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)
output.writerow(dict((fn,fn) for fn in headers))
for row in rows:
    output.writerow(row)
Author: myname, 2012-01-05

4 answers

Domyślnie klasy w module csv używają Terminatorów liniowych w stylu Windows (\r\n) zamiast uniksowych (\n). Czy to może być przyczyną pozornych przerw w linii podwójnej?

Jeśli tak, możesz to nadpisać w konstruktorze DictWriter:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', lineterminator='\n', fieldnames=headers)
 102
Author: FatBusinessman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:44:21

Z http://docs.python.org/library/csv.html#csv.writer :

Jeśli plik CSV jest obiektem file, musi być otwarty z flagą 'b' na platformy, gdzie to robi różnicę.

Innymi słowy, otwierając plik przekazujesz 'wb' zamiast 'w'.
Możesz również użyć instrukcji with, aby zamknąć plik, gdy skończysz do niego pisać.
Testowany przykład poniżej:

from __future__ import with_statement # not necessary in newer versions
import csv
headers=['id', 'year', 'activity', 'lineitem', 'datum']
with open('file3.csv','wb') as fou: # note: 'wb' instead of 'w'
    output = csv.DictWriter(fou,delimiter=',',fieldnames=headers)
    output.writerow(dict((fn,fn) for fn in headers))
    output.writerows(rows)
 30
Author: bernie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:54:45

Zmiana "w" (write) w tej linii:

output = csv.DictWriter(open('file3.csv','w'), delimiter=',', fieldnames=headers)

To 'WB' (write binary) naprawiło ten problem dla mnie:

output = csv.DictWriter(open('file3.csv','wb'), delimiter=',', fieldnames=headers)

Python v2. 75: Open()

Podziękowania dla @dandrejvv za rozwiązanie w komentarzu do oryginalnego postu powyżej.

 10
Author: James Nicholson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 21:28:04

Właśnie przetestowałem Twój fragment, i nie ma tu podwójnej linii odstępu. Końcówki to \r\n, więc to co bym sprawdził w Twoim przypadku to:

  1. twój edytor czyta poprawnie plik DOS
  2. no \ n exist in values of your rows dict.

(zauważ, że nawet przez umieszczenie wartości z \n, dyktator automatycznie cytuje wartość.)

 0
Author: tito,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-05 17:42:35