Buat file .csv dengan nilai dari daftar Python

181

Saya mencoba membuat file .csv dengan nilai dari daftar Python. Ketika saya mencetak nilai-nilai dalam daftar mereka semua unicode (?), Yaitu mereka terlihat seperti ini

[u'value 1', u'value 2', ...]

Jika saya beralih melalui nilai-nilai dalam daftar yaitu for v in mylist: print vmereka tampaknya menjadi teks biasa.

Dan saya bisa menempatkan ,antara masing-masing denganprint ','.join(mylist)

Dan saya dapat menampilkan ke file, yaitu

myfile = open(...)
print >>myfile, ','.join(mylist)

Tapi saya ingin output ke CSV dan memiliki pembatas di sekitar nilai-nilai dalam daftar misalnya

"value 1", "value 2", ... 

Saya tidak dapat menemukan cara mudah untuk memasukkan pembatas dalam format, misalnya saya telah mencoba melalui joinpernyataan. Bagaimana saya bisa melakukan ini?

Fortilan
sumber
Terima kasih semuanya, saya telah menggabungkan ide-ide dari beberapa jawaban untuk menyelesaikan pertanyaan saya :) Saya sekarang menggunakan modul csv untuk menulis data [...] langsung ke file impor data csv = [...] myfile = open ( ..., 'wb') out = csv.writer (terbuka ("myfile.csv", "w"), delimiter = ',', mengutip = csv.QUOTE_ALL) out.writerow (data) berfungsi dengan baik, saya membuat data saya [] dengan mengambil beberapa data dari spreadsheet menggunakan xlrd dan modul csv menuliskannya ke file dengan pembatas yang tepat, semuanya bagus :) ty all again
Fortilan
Pendekatan yang lebih baru adalah menggunakan panda
Richard
Pengguna Python 3.4, ini bekerja paling baik untuk saya: stackoverflow.com/questions/25022677/...
Leigh

Jawaban:

252
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Sunting: ini hanya berfungsi dengan python 2.x.

Untuk membuatnya bekerja dengan python 3.x ganti wbdengan w( lihat jawaban SO ini )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)
Alex Martelli
sumber
11
Perhatikan bahwa csvmodul dalam 2.x tidak dapat menangani unicodes dengan benar; lihat dokumentasi modul untuk contoh tentang cara menangani hal ini. docs.python.org/library/csv.html
Ignacio Vazquez-Abrams
14
Anda juga dapat menggunakan wr.writerows (daftar)
tovmeod
4
Writerows tampaknya memecah setiap elemen dalam daftar menjadi kolom jika masing-masing elemen adalah daftar juga. Ini sangat berguna untuk menghasilkan tabel.
whatnick
6
Itu tidak bekerja dengan python 3.4. Saya mendapatkan TypeError: 'str' does not support the buffer interface.
botchniaque
1
Untuk Python 2, gunakan 'w'seperti di sini: stackoverflow.com/questions/34283178/…
banan3'14
105

Berikut ini adalah versi aman dari Alex Martelli:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)
Cristian Garcia
sumber
3
ditambah 1 untuk digunakan with, pastikan file ditutup ketika selesai
BoltzmannBrain
Jika saya menggunakan ini di dalam for loop, haruskah seluruh blok dengan bersarang di bawah for loop? Atau akankah lebih efisien jika hanya ada wr.writerow(my_list)di dalam loop?
crypdick
1
@crypdick Anda tidak harus meletakkan seluruh blok ke dalam loop. Buka file, lalu tulis setiap baris dalam satu lingkaran. Tidak perlu membuka file n kali untuk menulis dan baris.
Greg Kaleka
Jika Anda menulis objek string ke file, sarankan menggunakan 'wt' saat membuka file untuk menghindari TypeError: diperlukan objek seperti byte, bukan 'str'.
don_Gunner94
41

Untuk pendekatan lain, Anda dapat menggunakan DataFrame di panda : Dan itu dapat dengan mudah membuang data ke csv seperti kode di bawah ini:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)
Qy Zuo
sumber
1
Terima kasih atas cuplikan kode ini, yang dapat memberikan bantuan segera. Penjelasan yang tepat akan sangat meningkatkan nilai pendidikannya dengan menunjukkan mengapa ini adalah solusi yang baik untuk masalah ini, dan akan membuatnya lebih bermanfaat bagi pembaca masa depan dengan pertanyaan yang serupa, tetapi tidak sama. Harap edit jawaban Anda untuk menambahkan penjelasan, dan berikan indikasi batasan dan asumsi apa yang berlaku.
Toby Speight
5
Agar ini berfungsi, daftar harus memiliki panjang yang sama, jika tidak Anda akan mendapatkan ValueError (pandas v 0.22.0)
cheevahagadog
32

Opsi terbaik yang saya temukan menggunakan savetxtdari numpymodul :

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

Jika Anda memiliki banyak daftar yang perlu ditumpuk

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)
tokenizer_fsj
sumber
8
Ini bagus untuk pekerjaan numerik, tetapi tidak akan berfungsi saat menampilkan string dalam daftar.
Ricardo Cruz
12

Gunakan csvmodul python untuk membaca dan menulis file koma atau dibatasi-tab. Modul csv lebih disukai karena memberi Anda kontrol yang baik atas penawaran.

Misalnya, berikut ini contoh yang berhasil untuk Anda:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Menghasilkan:

"value 1","value 2","value 3"
ay32
sumber
4
Menghasilkan file kosong untuk saya
caspii
Jalankan pertama kosong dan Anda juga tidak dapat menghapusnya, karena itu kemudian dibuka dengan python. Jalankan kedua (atau lebih tepatnya: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))mengisi data, tidak peduli apakah Anda meletakkan open("myfile.csv","w")atau file baru open("myfile2.csv","w"). Sepertinya objek keluar tidak dapat berurusan dengan objek file yang dibangun saat dijalankan, tetapi menyimpan proses output sebagai todo. Dengan kata lain: objek keluar menyimpan objek file dalam menjalankan pertama tetapi hanya menulis ketika objek file sudah ada! Lihat solusi tepat di bawah @Saurabh Adhikary
Lorenz
7

Anda bisa menggunakan metode string.join dalam kasus ini.

Pisahkan beberapa baris untuk kejelasan - inilah sesi interaktif

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Atau sebagai satu baris

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Namun, Anda mungkin memiliki masalah adalah string Anda telah mendapatkan penawaran harga. Jika demikian, Anda harus memutuskan bagaimana cara menghindarinya.

The modul CSV bisa mengurus semua ini untuk Anda, memungkinkan Anda untuk memilih antara berbagai pilihan mengutip (semua bidang, hanya ladang dengan kutipan dan seperators, hanya bidang non numerik, dll) dan bagaimana charecters kontrol esacpe (tanda kutip ganda, atau string yang lolos). Jika nilai-nilai Anda sederhana, string.join mungkin akan baik-baik saja tetapi jika Anda harus mengelola banyak kasus tepi, gunakan modul yang tersedia.

Robert Christie
sumber
3

Solusi ini kedengarannya gila, tetapi berfungsi selembut madu

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

File sedang ditulis oleh csvwriter maka sifat csv dipertahankan yaitu dipisahkan oleh koma. Pembatas membantu di bagian utama dengan memindahkan item daftar ke baris berikutnya, setiap kali.

Saurabh Adhikary
sumber
1
Begitu kecil dan begitu cepat
Ian Samz
1
berfungsi, dan jika Anda memiliki daftar bersarang, memperluas contoh @ vy32, Anda memiliki:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz
apakah itu terdengar gila? Saya pikir itu kedengarannya baik
Stephanie Owen
3

Untuk membuat dan menulis ke file csv

Contoh di bawah ini menunjukkan pembuatan dan penulisan file csv. untuk membuat penulis file dinamis, kita perlu mengimpor paket impor csv , kemudian perlu membuat instance file dengan referensi file Mis: - dengan terbuka ("D: \ sample.csv", "w", newline = "" ) sebagai file_writer

di sini jika file tidak ada dengan direktori file yang disebutkan maka python akan membuat file yang sama di direktori yang ditentukan, dan "w" mewakili write, jika Anda ingin membaca file kemudian ganti "w" dengan "r" atau untuk menambahkan ke file yang ada lalu "a". newline = "" menentukan bahwa ia menghapus baris kosong tambahan untuk setiap kali Anda membuat baris sehingga untuk menghilangkan baris kosong kami menggunakan newline = "", buat beberapa nama bidang (nama kolom) menggunakan daftar seperti bidang = = "" Nama "," Usia "," Class "] , kemudian berlaku untuk instance penulis seperti writer = csv.DictWriter (file_writer, fieldnames = fields) di sini menggunakan Kamus penulis dan menetapkan nama kolom, untuk menulis nama kolom ke csv kami menggunakan penulis. , saat menulis nilai file harus diteruskan menggunakan metode kamus, di sini kuncinya adalah nama kolom dan nilai adalah nilai kunci Anda masing-masing

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})
prasanna kumar
sumber
2

Notebook Jupyter

Katakanlah daftar Anda A

Kemudian Anda dapat membuat kode iklan berikut yang akan Anda miliki sebagai file csv (kolom saja!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()
rsc05
sumber
1

Anda harus menggunakan modul CSV untuk memastikan, tetapi kemungkinan besar, Anda harus menulis unicode. Bagi mereka yang perlu menulis unicode, ini adalah kelas dari halaman contoh, yang dapat Anda gunakan sebagai modul util:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)
kommradHomer
sumber
1

Berikut ini solusi lain yang tidak memerlukan csvmodul.

print ', '.join(['"'+i+'"' for i in myList])

Contoh:

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

Namun, jika daftar awal berisi beberapa ", mereka tidak akan lolos. Jika diperlukan, dimungkinkan untuk memanggil fungsi untuk menghindarinya seperti itu:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
Richard
sumber