Viết danh sách Python của danh sách vào tệp csv


168

Tôi có một danh sách dài các danh sách của mẫu sau ---

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

tức là các giá trị trong danh sách có nhiều loại khác nhau - float, int, string. Làm thế nào để tôi viết nó vào một tệp csv để tệp csv đầu ra của tôi trông như thế nào

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

Câu trả lời:


299

Mô-đun CSV tích hợp của Python có thể xử lý việc này dễ dàng:

import csv

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

Điều này giả định danh sách của bạn được định nghĩa là a, như trong câu hỏi của bạn. Bạn có thể điều chỉnh định dạng chính xác của CSV đầu ra thông qua các tham số tùy chọn khác nhau để được csv.writer()ghi lại trong trang tham chiếu thư viện được liên kết ở trên.

Cập nhật cho Python 3

import csv

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

88
Để tương thích với Python 3, hãy xóa "b" khỏi "wb".
Vlad V

28
Với Python 3 - mở ('output.csv', 'w', newline = ''). Tôi nhận được một dòng bổ sung nếu tôi bỏ qua tham số dòng mới. docs.python.org/3/l Library / csv.html
Spa

1
Trong python3 tôi đã phải sử dụng open ('output.csv', 'w', newline = "")
Tim Mottram

1
WOW rằng python 3 lỗi là rất không có ích. Cảm ơn @vladV (một đối tượng giống byte là bắt buộc, không phải 'str'). Nó có ý nghĩa trong nhận thức muộn màng, nhưng không cung cấp thông tin về nơi để xem xét tất cả.
Rambatino

1
@tlalco có lẽ có nghĩa là bạn đang sử dụng Python 2, trong trường hợp đó bạn nên sử dụng khối mã đầu tiên thay vì khối thứ hai. (Điều đó cũng có nghĩa là bạn nên xem xét chuyển sang Python 3.)
Amber

35

Bạn có thể sử dụng 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)

Tôi không nghĩ nên sử dụng pandasnếu thư viện tích hợp csvcó thể làm được.
Simin Jie

6
tôi thích gấu trúc vì nó mạnh mẽ
dorbodwolf

9
gấu trúc rất mạnh mẽ, chắc chắn, nhưng tôi sẽ không sử dụng một chiếc McLaren để lái xe đến cửa hàng góc bên cạnh.
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]])

tài liệu chính thức: http://docs.python.org/2/l Library / csv.html


1
Điều này sẽ nhận được +1 của tôi nếu bạn có thể giải thích câu trả lời của mình bằng một số nhận xét.
Burhan Khalid

3
writerowkhông có nhiều đối số.
Amber

1
>>> w.writerow ("a", "b", "c") TracBack (cuộc gọi gần đây nhất): Tệp "<stdin>", dòng 1, trong <module> TypeError: wrow () có chính xác một đối số (3 cho)
Amber

@Amber bạn dùng phiên bản nào của python?
Dmitry Zagorulkin

4
@Amber xin lỗi. tôi đã bỏ lỡ []
Dmitry Zagorulkin

11

Nếu vì bất cứ lý do bạn muốn làm nó bằng tay (không sử dụng một mô-đun như csv, pandas, numpyvv):

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

Tất nhiên, việc cuộn phiên bản của riêng bạn có thể dễ bị lỗi và không hiệu quả ... đó thường là lý do tại sao có một mô-đun cho điều đó. Nhưng đôi khi viết riêng của bạn có thể giúp bạn hiểu cách họ làm việc, và đôi khi nó chỉ dễ dàng hơn.


11

Sử dụng csv.writer trong danh sách rất lớn của tôi mất khá nhiều thời gian. Tôi quyết định sử dụng gấu trúc, nó nhanh hơn và dễ kiểm soát và dễ hiểu hơn:

 import pandas

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

Phần tốt bạn có thể thay đổi đôi khi để tạo tệp csv tốt hơn:

 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

Giải pháp của Ambers cũng hoạt động tốt cho các mảng 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

Nếu bạn không muốn nhập csvmô-đun cho điều đó, bạn có thể viết danh sách các danh sách vào tệp csv chỉ bằng cách sử dụng Python dựng sẵn

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

3

Đảm bảo chỉ ra lineterinator='\n'khi tạo nhà văn; mặt khác, một dòng trống bổ sung có thể được ghi vào tệp sau mỗi dòng dữ liệu khi nguồn dữ liệu từ tệp csv khác ...

Đây là giải pháp của tôi:

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

Làm thế nào về việc bỏ danh sách danh sách vào dưa chua và khôi phục nó với mô-đun dưa chua ? Nó khá thuận tiện.

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

Tôi đã nhận được một thông báo lỗi khi làm theo các ví dụ với tham số dòng mới trong hàm csv.writer. Các mã sau đây làm việc cho tôi.

 with open(strFileName, "w") as f:
    writer = csv.writer(f, delimiter=',',  quoting=csv.QUOTE_MINIMAL)
    writer.writerows(result)
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.