Python menulis ke CSV baris demi baris


102

Saya memiliki data yang sedang diakses melalui permintaan http dan dikirim kembali oleh server dalam format yang dipisahkan koma, saya memiliki kode berikut:

site= 'www.example.com'
hdr = {'User-Agent': 'Mozilla/5.0'}
req = urllib2.Request(site,headers=hdr)
page = urllib2.urlopen(req)
soup = BeautifulSoup(page)
soup = soup.get_text()
text=str(soup)

Isi teksnya adalah sebagai berikut:

april,2,5,7
may,3,5,8
june,4,7,3
july,5,6,9

Bagaimana cara menyimpan data ini ke dalam file CSV. Saya tahu saya dapat melakukan sesuatu di sepanjang baris berikut untuk mengulang baris demi baris:

import StringIO
s = StringIO.StringIO(text)
for line in s:

Tapi saya tidak yakin bagaimana sekarang menulis setiap baris dengan benar ke CSV

EDIT ---> Terima kasih atas umpan balik seperti yang disarankan, solusinya agak sederhana dan dapat dilihat di bawah.

Larutan:

import StringIO
s = StringIO.StringIO(text)
with open('fileName.csv', 'w') as f:
    for line in s:
        f.write(line)

1
Ini sudah menjadi CSV, Anda hanya perlu menulis setiap baris ke file ...
icedwater

1
Saya tidak yakin Anda bahkan membutuhkan StringIOimpor, jujur ​​saja. Selain itu, solusi sebagaimana adanya mungkin tidak memisahkan baris, karena f.write()tidak menambahkan baris baru secara otomatis.
es

@icedwater Saya mengerti apa yang Anda katakan, tetapi saya menjalankan kode di atas dan dapat menyimpan data dengan benar ke file csv.
Mustard Tiger

Jawaban:


176

Cara umum:

##text=List of strings to be written to file
with open('csvfile.csv','wb') as file:
    for line in text:
        file.write(line)
        file.write('\n')

ATAU

Menggunakan penulis CSV:

import csv
with open(<path to output_csv>, "wb") as csv_file:
        writer = csv.writer(csv_file, delimiter=',')
        for line in data:
            writer.writerow(line)

ATAU

Cara termudah:

f = open('csvfile.csv','w')
f.write('hi there\n') #Give your csv text here.
## Python will convert \n to os.linesep
f.close()

17
untuk python 3, ubah kewith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed

1
Informasi yang hilang di baris ini for line in data:. Tolong perbaiki itu. Terima kasih.
Francisco Maria Calisto

@gsamaras Idenya adalah untuk membantu komunitas, tidak seperti Anda mengedit dan memberi komentar yang tidak berguna.
Ani Menon

bagaimana cara menambahkan baris, jika sudah ada sesuatu di file csv, menggunakan solusi ketiga?
Jürgen K.

3
@ Jürgen. Gunakan 'a'(mode tambah) sebagai pengganti 'w'(mode tulis).
Ani Menon

15

Anda bisa menulis ke file seperti Anda menulis file biasa.

with open('csvfile.csv','wb') as file:
    for l in text:
        file.write(l)
        file.write('\n')

Jika untuk berjaga-jaga, itu adalah daftar daftar, Anda dapat langsung menggunakan csvmodul bawaan

import csv

with open("csvfile.csv", "wb") as file:
    writer = csv.writer(file)
    writer.writerows(text)

8

Saya hanya akan menulis setiap baris ke file, karena sudah dalam format CSV:

write_file = "output.csv"
with open(write_file, "w") as output:
    for line in text:
        output.write(line + '\n')

Namun, saya tidak ingat bagaimana menulis baris dengan jeda baris: p

Juga, Anda mungkin ingin melihat di jawaban ini sekitar write(), writelines()dan '\n'.


4

Untuk melengkapi jawaban sebelumnya, saya menyiapkan kelas cepat untuk menulis ke file CSV. Ini membuatnya lebih mudah untuk mengelola dan menutup file yang terbuka dan mencapai konsistensi dan kode yang lebih bersih jika Anda harus menangani banyak file.

class CSVWriter():

    filename = None
    fp = None
    writer = None

    def __init__(self, filename):
        self.filename = filename
        self.fp = open(self.filename, 'w', encoding='utf8')
        self.writer = csv.writer(self.fp, delimiter=';', quotechar='"', quoting=csv.QUOTE_ALL, lineterminator='\n')

    def close(self):
        self.fp.close()

    def write(self, elems):
        self.writer.writerow(elems)

    def size(self):
        return os.path.getsize(self.filename)

    def fname(self):
        return self.filename

Contoh penggunaan:

mycsv = CSVWriter('/tmp/test.csv')
mycsv.write((12,'green','apples'))
mycsv.write((7,'yellow','bananas'))
mycsv.close()
print("Written %d bytes to %s" % (mycsv.size(), mycsv.fname()))

Selamat bersenang-senang


1

Bagaimana dengan ini:

with open("your_csv_file.csv", "w") as f:
    f.write("\n".join(text))

str.join () Mengembalikan string yang merupakan rangkaian string di iterable. Pemisah antar elemen adalah string yang menyediakan metode ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.