2012-03-23 17 views
19

Zdaję sobie sprawę, że biblioteka csv w Pythonie zawsze generuje znaki końca linii DOS. Nawet jeśli używam trybu 'wb', nawet jeśli używam Linuksa. Ten kod zawsze używa '\r\n' jako końca separatora linii. Jak mogę to zrobić, używając tylko '\n'?Czy program piszący CSV w Pythonie zawsze używa znaków końca linii DOS?

+3

Specyfikacja CSV MIME nakazuje CRLF jako ogranicznik linii: https://tools.ietf.org/html/rfc4180 –

+0

Wierzę, że czytnik csv * zawsze działa i nie można go zmienić, ale pytasz tylko o to o * pisarzu *, którego domyślną można zmienić. – smci

Odpowiedz

42

Można give your writer instancja zwyczaj lineterminator argumentem konstruktora:

writer = csv.writer(f, lineterminator="\n") 
+0

może określić liniowiec jako kombinację dwóch znaków? – user1479571

+0

@ user1479571 Czy próbowałeś? –

19

Jak Niklas answered The lineterminator argument pozwala na wybór zakończeń linii. Zamiast trudnego kodowania go do \n, uniezależnić go od platformy, korzystając z platformy użytkownika line separator: os.linesep.

import csv 
import os 

f = open('output.csv', 'wb') 
writer = csv.writer(f, lineterminator=os.linesep) 
writer.writerow([2,3,4]) 
f.close() 

Dla osób, które znajdują ten wpis, nie przegap 'wb'. Nie zauważysz problemu, jeśli go brakuje na niektórych platformach, takich jak GNU/Linux, ale ważne jest, aby otworzyć plik na binary mode na platformach, na których ma to znaczenie, takich jak Windows. W przeciwnym razie plik csv może zakończyć się zakończeniami linii, takimi jak \r\r\n. Jeśli używasz 'wb' i os.linesep, zakończenia linii powinny być prawidłowe na wszystkich platformach.

+0

, więc nawet jeśli utworzysz wersję "* niezależną od platformy *", twój skrypt jest nadal zależny od platformy, ponieważ musisz otworzyć go w systemie binarnym, ale tylko w razie potrzeby? Jeśli spróbuję 'wb' na Linuksie, otrzymuję komunikat o błędzie dla' writer.writeheader() ' –

+1

Po prostu wypróbowałem to na Ubuntu 16.04, używając zarówno' writer' i 'DictWriter' z' wb', @CiprianTomoiaga, i to działa dobrze dla mnie. Proponuję zamieścić nowe pytanie z próbką kodu i komunikat o błędzie, a następnie dodaj komentarz tutaj z linkiem do Twojego pytania. –

+1

@CiprianTomoiaga To nie działa z Pythonem 3. Moduł CSV zakłada, że ​​może napisać zwykłe ciągi znaków, a tak nie jest, jeśli otworzysz plik za pomocą '' wb'' (otrzymasz "TypError") . Tak więc musisz otworzyć plik w następujący sposób: 'f = open ('output.csv', 'w', newline = '')' podczas korzystania z Pythona 3. Zobacz także [Dokumentacja CSV Pythona 3] (https: //docs.python.org/3.5/library/csv.html#csv.writer). – maxschlepzig