การเขียนรายการ Python ของรายการไปยังไฟล์ csv


168

ฉันมีรายการยาว ๆ ของแบบฟอร์มต่อไปนี้ ---

a = [[1.2,'abc',3],[1.2,'werew',4],........,[1.4,'qew',2]]

เช่นค่าในรายการเป็นประเภทที่แตกต่างกัน - float, int, strings ฉันจะเขียนลงในไฟล์ csv ได้อย่างไรเพื่อให้ไฟล์ csv ที่ส่งออกของฉันดูเหมือน

1.2,abc,3
1.2,werew,4
.
.
.
1.4,qew,2

คำตอบ:


299

โมดูล CSVในตัวของ Python สามารถจัดการสิ่งนี้ได้อย่างง่ายดาย:

import csv

with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(a)

สิ่งนี้จะถือว่ารายการของคุณมีการกำหนดเหมือนaในคำถามของคุณ คุณสามารถปรับแต่งรูปแบบที่แน่นอนของเอาต์พุต CSV ผ่านพารามิเตอร์ตัวเลือกต่างๆเพื่อcsv.writer()บันทึกไว้ในหน้าอ้างอิงไลบรารีที่ลิงก์ด้านบน

อัพเดทสำหรับ Python 3

import csv

with open("out.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(a)

88
สำหรับความเข้ากันได้ของ Python 3 ให้ลบ "b" ออกจาก "wb"
วลาด V

28
ด้วย Python 3 - open ('output.csv', 'w', newline = '') ฉันได้รับบรรทัดพิเศษถ้าฉันไม่ใช้พารามิเตอร์ของบรรทัดใหม่ docs.python.org/3/library/csv.html#csv.writer
สปา

1
ใน python3 ฉันต้องใช้ open ('output.csv', 'w', newline = "")
Tim Mottram

1
ว้าวข้อผิดพลาดของ python 3 นั้นไม่มีประโยชน์อะไรมาก ขอบคุณ @vladV (จำเป็นต้องมีวัตถุคล้ายไบต์ไม่ใช่ 'str') มันค่อนข้างสมเหตุสมผลในการเข้าใจถึงปัญหาหลังเหตุการณ์ แต่ไม่ใช่ข้อมูลที่จะดูทั้งหมด
Rambatino

1
@tlalco ซึ่งอาจหมายความว่าคุณกำลังใช้ Python 2 ซึ่งในกรณีนี้คุณควรใช้บล็อกโค้ดแรกแทนที่จะเป็นบล็อกที่สอง (หมายความว่าคุณควรเปลี่ยนมาใช้ Python 3)
Amber

35

คุณสามารถใช้pandas:

In [1]: import pandas as pd

In [2]: a = [[1.2,'abc',3],[1.2,'werew',4],[1.4,'qew',2]]

In [3]: my_df = pd.DataFrame(a)

In [4]: my_df.to_csv('my_csv.csv', index=False, header=False)

ฉันไม่คิดว่าควรใช้pandasหากห้องสมุดในตัวcsvสามารถทำได้
Simin Jie

6
ฉันชอบหมีแพนด้าเพราะมันมีประสิทธิภาพ
dorbodwolf

9
นุ่นมีพลังแน่นอน แต่ฉันจะไม่ใช้แม็คลาเรนขับรถไปที่ร้านหัวมุมประตูถัดไป
MI Wright

30
import csv
with open(file_path, 'a') as outcsv:   
    #configure writer to write standard csv file
    writer = csv.writer(outcsv, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
    writer.writerow(['number', 'text', 'number'])
    for item in list:
        #Write item to outcsv
        writer.writerow([item[0], item[1], item[2]])

เอกสารอย่างเป็นทางการ: http://docs.python.org/2/library/csv.html


1
นี่จะได้รับ +1 ของฉันถ้าคุณสามารถอธิบายคำตอบของคุณด้วยความคิดเห็น
Burhan Khalid

3
writerowไม่ได้มีหลายข้อโต้แย้ง
อำพัน

1
>>> w.writerow ("a", "b", "c") Traceback (การโทรล่าสุดครั้งล่าสุด): ไฟล์ "<stdin>", บรรทัดที่ 1, ใน <โมดูล> TypeError Type: Writer () ใช้อาร์กิวเมนต์หนึ่งตัว (มอบให้ 3 ครั้ง)
แอมเบอร์

@ ธันวาคมคุณใช้งูหลามรุ่นอะไร?
Dmitry Zagorulkin

4
@ ธันวาคมฉันขอโทษ ฉันพลาด []
Dmitry Zagorulkin

11

หากมีเหตุผลอะไรก็ตามที่คุณอยากจะทำมันด้วยตนเอง (โดยไม่ใช้โมดูลเช่นcsv, pandas, numpyฯลฯ ):

with open('myfile.csv','w') as f:
    for sublist in mylist:
        for item in sublist:
            f.write(item + ',')
        f.write('\n')

แน่นอนว่าการกลิ้งเวอร์ชั่นของคุณเองนั้นอาจจะเกิดข้อผิดพลาดและไม่มีประสิทธิภาพ ... แต่บางครั้งการเขียนของคุณเองสามารถช่วยให้คุณเข้าใจวิธีการทำงานและบางครั้งก็ง่ายขึ้น


11

การใช้ csv.writer ในรายการที่มีขนาดใหญ่มากของฉันใช้เวลาค่อนข้างนาน ฉันตัดสินใจใช้นุ่นมันเร็วและง่ายต่อการควบคุมและเข้าใจมากขึ้น:

 import pandas

 yourlist = [[...],...,[...]]
 pd = pandas.DataFrame(yourlist)
 pd.to_csv("mylist.csv")

ส่วนที่ดีที่คุณสามารถเปลี่ยนบางสิ่งเพื่อสร้างไฟล์ csv ที่ดีกว่า:

 yourlist = [[...],...,[...]]
 columns = ["abcd","bcde","cdef"] #a csv with 3 columns
 index = [i[0] for i in yourlist] #first element of every list in yourlist
 not_index_list = [i[1:] for i in yourlist]
 pd = pandas.DataFrame(not_index_list, columns = columns, index = index)

 #Now you have a csv with columns and index:
 pd.to_csv("mylist.csv")

5

โซลูชันของ Ambers ยังทำงานได้ดีสำหรับอาร์เรย์ numpy:

from pylab import *
import csv

array_=arange(0,10,1)
list_=[array_,array_*2,array_*3]
with open("output.csv", "wb") as f:
    writer = csv.writer(f)
    writer.writerows(list_)

4

หากคุณไม่ต้องการนำเข้าcsvโมดูลสำหรับสิ่งนั้นคุณสามารถเขียนรายการของรายการไปยังไฟล์ csv โดยใช้ Python ในตัวเท่านั้น

with open("output.csv", "w") as f:
    for row in a:
        f.write("%s\n" % ','.join(str(col) for col in row))

3

ตรวจสอบให้แน่ใจเพื่อระบุlineterinator='\n'เมื่อสร้างนักเขียน; มิฉะนั้นบรรทัดว่างพิเศษอาจถูกเขียนลงในไฟล์หลังจากแต่ละบรรทัดข้อมูลเมื่อแหล่งข้อมูลมาจากไฟล์ csv อื่น ๆ ...

นี่คือทางออกของฉัน:

with open('csvfile', 'a') as csvfile:
    spamwriter = csv.writer(csvfile, delimiter='    ',quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n')
for i in range(0, len(data)):
    spamwriter.writerow(data[i])

3

วิธีการเกี่ยวกับการทิ้งรายการของรายการลงในดองและเรียกคืนด้วยโมดูลดอง ? มันค่อนข้างสะดวก

>>> import pickle
>>> 
>>> mylist = [1, 'foo', 'bar', {1, 2, 3}, [ [1,4,2,6], [3,6,0,10]]]
>>> with open('mylist', 'wb') as f:
...     pickle.dump(mylist, f) 


>>> with open('mylist', 'rb') as f:
...      mylist = pickle.load(f)
>>> mylist
[1, 'foo', 'bar', {1, 2, 3}, [[1, 4, 2, 6], [3, 6, 0, 10]]]
>>> 

0

ฉันได้รับข้อความแสดงข้อผิดพลาดเมื่อติดตามตัวอย่างด้วยพารามิเตอร์newlineในฟังก์ชั่น csv.writer รหัสต่อไปนี้ทำงานให้ฉัน

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.