Python เขียนเป็น CSV ทีละบรรทัด


104

ฉันมีข้อมูลที่ถูกเข้าถึงผ่านคำขอ http และถูกส่งกลับโดยเซิร์ฟเวอร์ในรูปแบบที่คั่นด้วยจุลภาคฉันมีรหัสต่อไปนี้:

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)

เนื้อหาของข้อความมีดังนี้:

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

ฉันจะบันทึกข้อมูลนี้เป็นไฟล์ CSV ได้อย่างไร ฉันรู้ว่าฉันสามารถทำบางอย่างตามบรรทัดต่อไปนี้เพื่อทำซ้ำทีละบรรทัด:

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

แต่ฉันไม่แน่ใจว่าจะเขียนแต่ละบรรทัดเป็น CSV ได้อย่างไร

แก้ไข ---> ขอบคุณสำหรับข้อเสนอแนะตามที่แนะนำวิธีแก้ปัญหาค่อนข้างง่ายและสามารถดูได้ด้านล่าง

วิธีการแก้:

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

1
มันเป็นไฟล์ CSV แล้วคุณแค่ต้องเขียนแต่ละบรรทัดลงในไฟล์ ...
icedwater

1
ฉันไม่แน่ใจว่าคุณต้องStringIOนำเข้าด้วยซ้ำพูดตามตรง นอกจากนี้วิธีแก้ปัญหาตามที่เป็นอยู่อาจไม่แยกบรรทัดเนื่องจากf.write()ไม่ได้ต่อท้ายบรรทัดใหม่โดยอัตโนมัติ
icedwater

@icedwater ฉันเข้าใจว่าคุณพูดอะไร แต่ฉันรันโค้ดด้านบนและสามารถจัดเก็บข้อมูลลงในไฟล์ csv ได้อย่างถูกต้อง
มัสตาร์ดไทเกอร์

คำตอบ:


180

วิธีทั่วไป:

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

หรือ

การใช้ CSV writer:

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)

หรือ

วิธีที่ง่ายที่สุด:

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
สำหรับ python 3 ให้เปลี่ยนเป็นwith open(<path to output_csv>, "w", newline='') as csv_file:
Khaled Hamed

1
ไม่มีข้อมูลในบรรทัดfor line in data:นี้ โปรดแก้ไขที่ ขอบคุณ.
Francisco Maria Calisto

@gsamaras ความคิดคือการช่วยเหลือชุมชนซึ่งแตกต่างจากคุณแก้ไขและแสดงความคิดเห็นซึ่งไม่มีประโยชน์
Ani Menon

วิธีต่อท้ายบรรทัดหากมีบางอย่างในไฟล์ csv โดยใช้โซลูชันที่สาม
Jürgen K.

4
@ JürgenK. ใช้'a'(โหมดผนวก) แทน'w'(โหมดเขียน)
Ani Menon

15

คุณสามารถเขียนลงในไฟล์ได้เหมือนกับที่คุณเขียนไฟล์ปกติ

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

หากในกรณีนี้เป็นรายการคุณสามารถใช้csvโมดูลในตัวได้โดยตรง

import csv

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

8

ฉันจะเขียนแต่ละบรรทัดลงในไฟล์เนื่องจากมันอยู่ในรูปแบบ CSV แล้ว:

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

ฉันจำวิธีการเขียนเส้นด้วยตัวแบ่งบรรทัดไม่ได้ในขณะนี้: p

นอกจากนี้คุณอาจจะอยากให้ดูที่คำตอบนี้เกี่ยวกับwrite(), และwritelines()'\n'


4

เพื่อเติมเต็มคำตอบก่อนหน้านี้ฉันเตรียมคลาสสั้น ๆ เพื่อเขียนลงในไฟล์ CSV ช่วยให้จัดการและปิดไฟล์ที่เปิดได้ง่ายขึ้นและบรรลุความสอดคล้องและรหัสที่สะอาดยิ่งขึ้นหากคุณต้องจัดการกับไฟล์หลายไฟล์

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

ตัวอย่างการใช้งาน:

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

มีความสุข


1

แล้วสิ่งนี้:

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

str.join ()ส่งคืนสตริงซึ่งเป็นการเชื่อมต่อของสตริงที่สามารถทำซ้ำได้ ตัวคั่นระหว่างองค์ประกอบคือสตริงที่ระบุวิธีนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.