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)
Mustard Tiger
sumber
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()
Ani Menon
sumber
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)
Vishwa
sumber
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'.

Air dingin
sumber
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

jrm
sumber
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.

Vlad Bezden
sumber