Python ghi vào CSV từng dòng


101

Tôi có dữ liệu đang được truy cập qua yêu cầu http và được máy chủ gửi lại ở định dạng được phân tách bằng dấu phẩy, tôi có mã sau:

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)

Nội dung văn bản như sau:

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

Làm cách nào để lưu dữ liệu này vào tệp CSV. Tôi biết tôi có thể làm điều gì đó dọc theo các dòng sau để lặp lại từng dòng:

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

Nhưng tôi không chắc làm thế nào để viết đúng từng dòng vào CSV

EDIT ---> Cảm ơn bạn đã phản hồi vì đã đề xuất giải pháp khá đơn giản và có thể được nhìn thấy bên dưới.

Giải pháp:

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

1
Nó đã là một CSV, bạn chỉ cần ghi từng dòng vào một tệp ...
icedwater

1
Tôi không chắc bạn thậm chí cần StringIOnhập khẩu, thành thật mà nói. Ngoài ra, giải pháp hiện tại có thể không tách các dòng, cũng như f.write()không tự động nối các dòng mới.
icedwater

@icedwater Tôi hiểu bạn nói gì, nhưng tôi đã chạy mã ở trên và nó có thể lưu trữ đúng cách dữ liệu vào tệp csv.
Mustard Tiger

Câu trả lời:


175

Cách chung:

##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')

HOẶC LÀ

Sử dụng trình viết 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)

HOẶC LÀ

Cách đơn giản nhất:

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

16
cho python 3, thay đổi nó đểwith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed

1
Thiếu thông tin trên dòng này for line in data:. Hãy sửa lỗi đó. Cảm ơn bạn.
Francisco Maria Calisto

@gsamaras Ý tưởng là để giúp đỡ cộng đồng, không giống như bạn chỉnh sửa và bình luận là vô ích.
Ani Menon

làm thế nào để nối thêm một dòng, nếu đã có thứ gì đó trong tệp csv, bằng cách sử dụng giải pháp thứ ba?
Jürgen K.

3
@ JürgenK. Sử dụng 'a'(chế độ nối thêm) thay cho 'w'(chế độ ghi).
Ani Menon

15

Bạn chỉ có thể ghi vào tệp như cách bạn ghi bất kỳ tệp bình thường nào.

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

Nếu chỉ trong trường hợp, đó là danh sách các danh sách, bạn có thể trực tiếp sử dụng csvmô-đun tích hợp sẵn

import csv

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

8

Tôi chỉ cần ghi từng dòng vào một tệp, vì nó đã ở định dạng CSV:

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

Tuy nhiên, tôi không thể nhớ cách viết dòng có ngắt dòng vào lúc này: p

Ngoài ra, bạn có thể muốn xem xét câu trả lời này về write(), writelines()'\n'.


4

Để bổ sung cho các câu trả lời trước, tôi đã chuẩn bị một lớp học nhanh để ghi vào tệp CSV. Nó giúp bạn dễ dàng quản lý và đóng các tệp đang mở, đồng thời đạt được tính nhất quán và mã sạch hơn nếu bạn phải xử lý nhiều tệp.

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

Ví dụ sử dụng:

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()))

Chúc vui vẻ


1

Cái này thì sao:

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

str.join () Trả về một chuỗi là sự ghép nối của các chuỗi trong có thể lặp lại. Dấu phân cách giữa các phần tử là chuỗi cung cấp phương thức này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.