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)
Kode ini membaca thefile.csv
, membuat perubahan, dan menulis hasilnya thefile_subset1
.
Namun, ketika saya membuka csv yang dihasilkan di Microsoft Excel, ada baris kosong tambahan setelah setiap catatan!
Apakah ada cara untuk membuatnya tidak membuat garis kosong tambahan?
Jawaban:
Dalam Python 2, buka
outfile
dengan mode'wb'
alih-alih'w'
. Thecsv.writer
menulis\r\n
ke dalam file secara langsung. Jika Anda tidak membuka file dalam mode biner , itu akan menulis\r\r\n
karena pada mode teks Windows akan menerjemahkan masing\n
- masing ke dalam\r\n
.Dalam Python 3 sintaks yang diperlukan berubah (lihat tautan dokumentasi di bawah), jadi buka
outfile
dengan parameter tambahannewline=''
(string kosong).Contoh:
Tautan Dokumentasi
sumber
io.open
dengannewlines
argumen. Jika Anda masih menulis dalam 2.x, itu sepertinya pilihan yang lebih baik karena ini kompatibel ke depan.io.open
. Adaunicodecsv
modul pihak ke - 3 untuk Python 2.7 yang berfungsi lebih baik.newline=''
Adakah yang tahu mengapa trik ini tidak bekerja di python3 dengan StringIO atau TemporaryFile?StringIO
buffer poin kode yang sama yang akan dikodekan ke file, danTemporaryFile
mendukungnewline
parameter, sehingga dapat dibuka sepertiopen
. Ajukan pertanyaan dengan program sampel yang tidak berfungsi.Membuka file dalam mode biner "wb" tidak akan berfungsi dalam Python 3+. Atau lebih tepatnya, Anda harus mengubah data Anda menjadi biner sebelum menulisnya. Itu hanya merepotkan.
Sebagai gantinya, Anda harus menyimpannya dalam mode teks, tetapi menimpa baris baru sebagai kosong. Seperti itu:
sumber
Jawaban sederhananya adalah bahwa file csv harus selalu dibuka dalam mode biner apakah untuk input atau output, karena jika tidak pada Windows ada masalah dengan baris yang berakhir. Khusus pada output modul csv akan menulis
\r\n
(terminator baris CSV standar) dan kemudian (dalam mode teks) runtime akan menggantikan\n
oleh\r\n
(terminator jalur standar Windows) memberikan hasil\r\r\n
.Mengotak-atik
lineterminator
BUKAN solusinya.sumber
Catatan: Tampaknya ini bukan solusi yang disukai karena cara garis tambahan ditambahkan pada sistem Windows. Sebagaimana dinyatakan dalam dokumen python :
Windows adalah salah satu platform di mana itu membuat perbedaan. Sementara mengubah terminator garis seperti yang saya jelaskan di bawah ini mungkin telah memperbaiki masalah, masalahnya dapat dihindari sama sekali dengan membuka file dalam mode biner. Orang mungkin mengatakan solusi ini lebih "elegan". "Mengutak-atik" dengan terminator garis kemungkinan akan menghasilkan kode yang tidak dapat diakses antara sistem dalam kasus ini, di mana membuka file dalam mode biner pada sistem unix tidak menghasilkan efek. yaitu. itu menghasilkan kode yang kompatibel lintas sistem.
Dari Python Documents :
Asli :
Sebagai bagian dari paramaters opsional untuk csv.writer jika Anda mendapatkan baris kosong tambahan Anda mungkin harus mengubah lineterminator (info di sini ). Contoh di bawah ini diadaptasi dari halaman python csv docs. Ubah dari '\ n' menjadi apa pun yang seharusnya. Karena ini hanya tikaman dalam gelap pada masalah ini mungkin atau mungkin tidak berhasil, tapi itu tebakan terbaik saya.
sumber
Saya menulis jawaban ini ke python 3, karena saya awalnya punya masalah yang sama.
Saya seharusnya mendapatkan data dari arduino menggunakan
PySerial
, dan menulisnya dalam file .csv. Setiap pembacaan dalam kasus saya berakhir dengan'\r\n'
, jadi baris baru selalu memisahkan setiap baris.Dalam kasus saya,
newline=''
opsi tidak berfungsi. Karena itu menunjukkan beberapa kesalahan seperti:Jadi sepertinya mereka tidak menerima penghilangan baris baru di sini.
Melihat salah satu jawaban di sini saja, saya sebutkan terminator garis dalam objek penulis, seperti,
writer = csv.writer(csv_file, delimiter=' ',lineterminator='\r')
dan itu berhasil bagi saya karena melewatkan baris baru tambahan.
sumber
with open('my_file.csv', 'a',newline='') as csvfile:
bekerja dengan sangat baik. Masalah dengan jawaban Anda adalah bahwa di sini Anda menulis' '
alih-alih''
"Lineterminator = '\ r'" mengizinkan untuk beralih ke baris berikutnya, tanpa baris kosong di antara dua.
sumber
Meminjam dari jawaban ini , sepertinya solusi terbersih adalah menggunakan
io.TextIOWrapper
. Saya berhasil memecahkan masalah ini untuk diri saya sebagai berikut:Jawaban di atas tidak kompatibel dengan Python 2. Untuk memiliki kompatibilitas, saya kira orang hanya perlu membungkus semua logika penulisan dalam sebuah
if
blok:sumber
Gunakan metode yang ditentukan di bawah ini untuk menulis data ke file CSV.
Cukup tambahkan
newline=''
parameter tambahan di dalamopen
metode:Ini akan menulis baris CSV tanpa membuat baris tambahan!
sumber
Saat menggunakan Python 3, baris kosong dapat dihindari dengan menggunakan modul codec . Sebagaimana dinyatakan dalam dokumentasi, file dibuka dalam mode biner sehingga tidak diperlukan perubahan kwarg baris baru. Saya mengalami masalah yang sama baru-baru ini dan itu berhasil bagi saya:
sumber