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()
Ini menghasilkan file,, test.csv
dengan tambahan \r
di setiap baris, seperti:
test.csv
hi,dude\r\r\nhi2,dude2\r\r\n
bukannya yang diharapkan:
hi,dude\r\nhi2,dude2\r\n
Mengapa ini terjadi, atau sebenarnya ini perilaku yang diinginkan?
catatan:
- Perilaku ini dapat terjadi dengan Python 2 atau 3.
Jawaban:
Python 3:
newline=''
newline='\n'
Python 2:
Di Windows, selalu buka file Anda dalam mode biner (
"rb"
atau"wb"
), sebelum meneruskannya kecsv.reader
ataucsv.writer
.Meskipun file tersebut adalah file teks, CSV dianggap format biner oleh perpustakaan yang terlibat, dengan
\r\n
memisahkan catatan. Jika pemisah itu ditulis dalam mode teks, runtime Python menggantikan\n
dengan\r\n
, maka\r\r\n
diamati dalam file.Lihat jawaban ini sebelumnya .
sumber
open(..., "w", newline="\n", encoding="utf-8")
.newline
bisa juga berupa string kosong, hasil yang sama."wb"
tidak bekerja di Python 3, string dan antarmuka buffer tidak kompatibel.writer = csv.writer(f, lineterminator='\n')
Sementara @ john-machin memberikan jawaban yang baik, itu tidak selalu merupakan pendekatan terbaik. Misalnya, ini tidak berfungsi pada Python 3 kecuali jika Anda menyandikan semua input Anda ke penulis CSV. Juga, itu tidak mengatasi masalah jika skrip ingin menggunakan sys.stdout sebagai aliran.
Saya sarankan untuk mengatur atribut 'lineterminator' ketika membuat penulis:
Contoh itu akan bekerja pada Python 2 dan Python 3 dan tidak akan menghasilkan karakter baris baru yang tidak diinginkan. Perhatikan, bagaimanapun, bahwa itu dapat menghasilkan baris baru yang tidak diinginkan (menghilangkan karakter LF pada sistem operasi Unix).
Namun dalam kebanyakan kasus, saya percaya bahwa perilaku lebih disukai dan lebih alami daripada memperlakukan semua CSV sebagai format biner. Saya memberikan jawaban ini sebagai alternatif untuk pertimbangan Anda.
sumber
\r
ini tidak lagi lolos! Sepertinya ini adalah bugcsvwriter
, tetapi seperti berdiri, mengeluarkan CSV yang tidak sesuai berarti ini bukan cara yang harus dilakukan.^M
masalah bagi saya sementara 2 saran jawaban yang diterima tidak berfungsi.Di Python 3 (saya belum mencoba ini di Python 2), Anda juga bisa melakukannya
sesuai dokumentasi .
Lebih lanjut tentang ini di catatan kaki doc :
sumber
Anda dapat memperkenalkan parameter lineterminator = '\ n' dalam perintah csv writer.
sumber
lineterminator='\n'
); modul CSV tampaknya merupakan asal dari\r\n
. Tidak ada set argumen yangopen
berpengaruh.Saya tidak yakin persis mengapa itu terjadi, tetapi mengubah mode file Anda dari "w" ke "wb" memperbaikinya. Lihat jawaban saya untuk " cara menghapus ^ M " untuk lebih jelasnya.
sumber
Anda harus menambahkan atribut newline = "\ n" untuk membuka fungsi seperti ini:
sumber
Perhatikan bahwa jika Anda menggunakan DictWriter, Anda akan memiliki baris baru dari fungsi terbuka dan baris baru dari fungsi writerow. Anda dapat menggunakan newline = '' di dalam fungsi terbuka untuk menghapus baris baru tambahan.
sumber