import csv
outfile = file('test.csv', 'w')
writer = csv.writer(outfile, delimiter=',', quoting=csv.QUOTE_MINIMAL)
writer.writerow(['hi','dude'])
writer.writerow(['hi2','dude2'])
outfile.close()
Generuje plik, test.csv
z dodatkowym \r
w każdym wierszu, tak:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
zamiast oczekiwanego:
hi,dude\r\nhi2,dude2\r\n
Dlaczego tak się dzieje, czy jest to pożądane zachowanie?
Uwaga:
- Takie zachowanie może wystąpić w Pythonie 2 lub 3.
Odpowiedzi:
Python 3:
newline=''
newline='\n'
Python 2:
W systemie Windows zawsze otwieraj pliki w trybie binarnym (
"rb"
lub"wb"
) przed przekazaniem ich docsv.reader
lubcsv.writer
.Mimo że plik jest plikiem tekstowym, zaangażowane biblioteki uznają format binarny za
\r\n
oddzielny. Jeśli to separator jest napisane w trybie tekstowym, środowisko wykonawcze Python zastępuje\n
się\r\n
, stąd\r\r\n
obserwowane w pliku.Zobacz poprzednią odpowiedź .
źródło
open(..., "w", newline="\n", encoding="utf-8")
.newline
może być również pustym ciągiem, tym samym wynikiem."wb"
nie działa w Pythonie 3, łańcuchy i interfejs bufora są niekompatybilne.writer = csv.writer(f, lineterminator='\n')
Chociaż @ john-machin daje dobrą odpowiedź, nie zawsze jest to najlepsze podejście. Na przykład nie działa w Pythonie 3, chyba że kodujesz wszystkie dane wejściowe do programu piszącego CSV. Ponadto nie rozwiązuje problemu, jeśli skrypt chce użyć sys.stdout jako strumienia.
Zamiast tego sugeruję ustawienie atrybutu „lineterminator” podczas tworzenia programu piszącego:
Ten przykład będzie działał na Python 2 i Python 3 i nie będzie generował niepożądanych znaków nowej linii. Należy jednak pamiętać, że może powodować niepożądane znaki nowej linii (pomijając znak LF w systemach operacyjnych Unix).
Jednak w większości przypadków uważam, że zachowanie jest lepsze i bardziej naturalne niż traktowanie całego pliku CSV jako formatu binarnego. Podaję tę odpowiedź jako alternatywę do rozważenia.
źródło
\r
nie jest już możliwe! Wygląda na to, że jest to błądcsvwriter
, ale w tej chwili wyświetlanie niezgodnego CSV oznacza, że nie jest to właściwa droga.^M
problem, podczas gdy 2 propozycje zaakceptowanej odpowiedzi nie zadziałały.W Python 3 (nie próbowałem tego w Python 2), możesz po prostu to zrobić
zgodnie z dokumentacją .
Więcej na ten temat w przypisie doktora :
źródło
Możesz wprowadzić parametr lineterminator = '\ n' w poleceniu piszącym csv.
źródło
lineterminator='\n'
); moduł CSV wydawał się być początkiem\r\n
. Brak zestawu argumentów, któreopen
miałyby jakikolwiek skutek.Nie jestem pewien, dlaczego tak się dzieje, ale zmiana trybu pliku z „w” na „wb” naprawia to. Zobacz moją odpowiedź na „ jak usunąć ^ M ”, aby uzyskać więcej informacji.
źródło
Musisz dodać atrybut newline = "\ n", aby otworzyć funkcję w następujący sposób:
źródło
Zauważ, że jeśli użyjesz DictWriter, będziesz mieć nowy wiersz z funkcji open i nowy wiersz z funkcji writerow. Możesz użyć nowej linii = '' w ramach funkcji otwartej, aby usunąć dodatkową nową linię.
źródło