Tạo tệp .csv với các giá trị từ danh sách Python


181

Tôi đang cố gắng tạo tệp .csv với các giá trị từ danh sách Python. Khi tôi in các giá trị trong danh sách, tất cả chúng đều là unicode (?), Tức là chúng trông giống như thế này

[u'value 1', u'value 2', ...]

Nếu tôi lặp qua các giá trị trong danh sách, nghĩa là for v in mylist: print vchúng có vẻ là văn bản thuần túy.

Và tôi có thể đặt một ,giữa mỗi vớiprint ','.join(mylist)

Và tôi có thể xuất ra một tập tin, tức là

myfile = open(...)
print >>myfile, ','.join(mylist)

Nhưng tôi muốn xuất ra CSV và có các dấu phân cách xung quanh các giá trị trong danh sách, ví dụ:

"value 1", "value 2", ... 

Tôi không thể tìm thấy một cách dễ dàng để bao gồm các dấu phân cách trong định dạng, ví dụ tôi đã thử qua joincâu lệnh. Tôi có thể làm cái này như thế nào?


Cảm ơn mọi người, tôi đã kết hợp các ý tưởng từ một vài câu trả lời để giải quyết câu hỏi của mình :) Bây giờ tôi sử dụng mô-đun csv để ghi dữ liệu [...] vào tệp nhập dữ liệu csv data = [...] myfile = open ( ..., 'wb') out = csv.writer (open ("myfile.csv", "w"), delimiter = ',', quoteing = csv.QUOTE_ALL) out.writerow (dữ liệu) hoạt động tốt, tôi xây dựng dữ liệu của tôi [] bằng cách lấy một số dữ liệu ra một bảng tính bằng xlrd và mô-đun csv ghi nó ra một tệp với các dấu phân cách đúng tất cả đều tốt :) đánh dấu lại tất cả
Fortilan

Một cách tiếp cận gần đây hơn có thể là sử dụng gấu trúc
Richard

Người dùng Python 3,4, điều này hoạt động tốt nhất với tôi: stackoverflow.com/questions/25022677/ triệt
Leigh

Câu trả lời:


252
import csv

with open(..., 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

Chỉnh sửa: điều này chỉ hoạt động với python 2.x.

Để làm cho nó hoạt động với python 3.x thay thế wbbằng w( xem câu trả lời SO này )

with open(..., 'w', newline='') as myfile:
     wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
     wr.writerow(mylist)

11
Xin lưu ý rằng csvmô-đun trong 2.x không xử lý đúng với unicodes; xem tài liệu mô-đun để biết ví dụ về cách đối phó với điều này. docs.python.org/l Library / csv.html
Ignacio Vazquez-Abrams

14
bạn cũng có thể sử dụng wr.writerows (danh sách)
tovmeod

4
Nhà văn dường như chia nhỏ từng phần tử trong danh sách thành các cột nếu mỗi phần tử là một danh sách. Điều này là khá tiện dụng để xuất bảng.
whatnick

6
Điều đó không làm việc với python 3.4. Tôi đang nhận được TypeError: 'str' does not support the buffer interface.
botchniaque

1
Đối với Python 2, sử dụng 'w'như ở đây: stackoverflow.com/questions/34283178/ cấp
banan3'14

105

Đây là phiên bản bảo mật của Alex Martelli:

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL)
    wr.writerow(mylist)

3
cộng 1 để sử dụng with, đảm bảo tệp được đóng khi hoàn tất
BoltzmannBrain

Nếu tôi đang sử dụng cái này bên trong một vòng lặp for, thì toàn bộ khối có được lồng dưới vòng lặp for không? Hoặc nó sẽ hiệu quả hơn khi chỉ có wr.writerow(my_list)bên trong vòng lặp?
crypdick

1
@crypdick bạn chắc chắn không nên đặt toàn bộ khối vào vòng lặp. Mở tệp, sau đó viết từng hàng trong một vòng lặp. Không cần phải mở tệp n lần để ghi n hàng.
Greg Kaleka

Nếu bạn đang viết các đối tượng chuỗi vào một tệp, sẽ đề xuất sử dụng 'wt' trong khi mở tệp để tránh TypeError: một đối tượng giống như byte là bắt buộc, không phải là 'str'.
don_Gunner94

41

Đối với cách tiếp cận khác, bạn có thể sử dụng DataFrame trong gấu trúc : Và nó có thể dễ dàng chuyển dữ liệu sang csv giống như mã dưới đây:

import pandas
df = pandas.DataFrame(data={"col1": list_1, "col2": list_2})
df.to_csv("./file.csv", sep=',',index=False)

1
Cảm ơn bạn vì đoạn mã này, có thể cung cấp một số trợ giúp ngay lập tức. Một lời giải thích phù hợp sẽ cải thiện đáng kể giá trị giáo dục của nó bằng cách chỉ ra lý do tại sao đây là một giải pháp tốt cho vấn đề và sẽ giúp nó hữu ích hơn cho những độc giả tương lai với những câu hỏi tương tự, nhưng không giống nhau. Vui lòng chỉnh sửa câu trả lời của bạn để thêm giải thích và đưa ra dấu hiệu về những hạn chế và giả định được áp dụng.
Toby Speight

5
Ngoài ra, để làm việc này, các danh sách cần phải có cùng độ dài, nếu không, bạn sẽ nhận được ValueError (pandas v 0.22.0)
cheevahagadog

32

Tùy chọn tốt nhất tôi tìm thấy là sử dụng savetxttừ numpymô-đun :

import numpy as np
np.savetxt("file_name.csv", data1, delimiter=",", fmt='%s', header=header)

Trong trường hợp bạn có nhiều danh sách cần được xếp chồng lên nhau

np.savetxt("file_name.csv", np.column_stack((data1, data2)), delimiter=",", fmt='%s', header=header)

8
Điều này tốt cho công việc số, nhưng nó sẽ không hoạt động khi có các chuỗi trong danh sách.
Ricardo Cruz

12

Sử dụng csvmô-đun của python để đọc và ghi các dấu phẩy hoặc các tệp được phân tách bằng tab. Mô-đun csv được ưa thích vì nó cho phép bạn kiểm soát tốt việc trích dẫn.

Ví dụ, đây là ví dụ làm việc cho bạn:

import csv
data = ["value %d" % i for i in range(1,4)]

out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL)
out.writerow(data)

Sản xuất:

"value 1","value 2","value 3"

4
Tạo một tệp trống cho tôi
caspii

Lần chạy đầu tiên trống và bạn cũng không thể xóa nó sau đó, vì sau đó nó được mở bằng python. Lần chạy thứ hai (hoặc chính xác hơn: out = csv.writer(open("myfile.csv","w"), delimiter=',',quoting=csv.QUOTE_ALL))điền dữ liệu, bất kể bạn đặt open("myfile.csv","w")hay tập tin mới open("myfile2.csv","w"). Có vẻ như đối tượng bên ngoài không thể xử lý đối tượng tập tin được xây dựng trên đường chạy, nhưng lưu trữ quá trình đầu ra dưới dạng việc cần làm. đối tượng out lưu trữ đối tượng tệp trong lần chạy đầu tiên nhưng chỉ ghi khi đối tượng tệp đã tồn tại! Xem giải pháp phù hợp bên dưới @Saurabh Adhikary
Lorenz

7

Bạn có thể sử dụng phương thức string.join trong trường hợp này.

Phân chia một vài dòng cho rõ ràng - đây là một phiên tương tác

>>> a = ['a','b','c']
>>> first = '", "'.join(a)
>>> second = '"%s"' % first
>>> print second
"a", "b", "c"

Hoặc là một dòng duy nhất

>>> print ('"%s"') % '", "'.join(a)
"a", "b", "c"

Tuy nhiên, bạn có thể có một vấn đề là chuỗi của bạn đã có dấu ngoặc kép được nhúng. Nếu đây là trường hợp bạn sẽ cần phải quyết định làm thế nào để thoát khỏi chúng.

Các mô-đun CSV có thể chăm sóc của tất cả những điều này cho bạn, cho phép bạn chọn giữa các tùy chọn trích dẫn khác nhau (tất cả các lĩnh vực, chỉ có các lĩnh vực với dấu ngoặc kép và seperators, chỉ có lĩnh vực không phải là số, vv) và làm thế nào để charecters kiểm soát esacpe (dấu ngoặc kép, hoặc thoát dây). Nếu các giá trị của bạn đơn giản, chuỗi.join có thể sẽ ổn nhưng nếu bạn phải quản lý nhiều trường hợp cạnh, hãy sử dụng mô-đun có sẵn.


3

Giải pháp này nghe có vẻ điên rồ, nhưng hoạt động trơn tru như mật ong

import csv

with open('filename', 'wb') as myfile:
    wr = csv.writer(myfile, quoting=csv.QUOTE_ALL,delimiter='\n')
    wr.writerow(mylist)

Tệp đang được viết bởi csvwriter do đó các thuộc tính csv được duy trì tức là được phân tách bằng dấu phẩy. Dấu phân cách giúp trong phần chính bằng cách di chuyển các mục danh sách sang dòng tiếp theo, mỗi lần.


1
Quá nhỏ và quá nhanh
Ian Samz

1
hoạt động và nếu bạn có một danh sách lồng nhau, mở rộng ví dụ về @ vy32, bạn có:data = [["value %d" % i, "value %d" % (i+1)] for i in range(1,4)] with open("myfile.txt","w") as f: out = csv.writer(f, quoting=csv.QUOTE_ALL, delimiter='\n') out.writerow([';'.join(x) for x in data])
Lorenz

nó thực sự nghe có vẻ điên rồ? Tôi nghĩ rằng nó nghe hoàn toàn tốt
Stephanie Owen

3

Để tạo và ghi vào tệp csv

Ví dụ dưới đây chứng minh việc tạo và viết một tệp csv. để tạo một trình ghi tệp động, chúng ta cần nhập một gói nhập csv , sau đó cần tạo một thể hiện của tệp có tham chiếu tệp Ex: - with open ("D: \ sample.csv", "w", newline = "" ) dưới dạng file_writer

Ở đây nếu tệp không tồn tại với thư mục tệp được đề cập thì python sẽ tạo cùng một tệp trong thư mục được chỉ định và "w" đại diện cho ghi, nếu bạn muốn đọc tệp thì thay thế "w" bằng "r" hoặc để chắp thêm đến tập tin hiện có thì "a". newline = "" chỉ định rằng nó sẽ xóa một hàng trống thừa cho mỗi lần bạn tạo hàng để loại bỏ hàng trống, chúng tôi sử dụng newline = "", tạo một số tên trường (tên cột) bằng cách sử dụng danh sách như trường = ["Tên", "Tuổi "," Class "] , sau đó áp dụng cho thể hiện của người viết như wr = csv.DictWriter (file_writer, fieldnames = field) ở đây bằng cách sử dụng trình ghi từ điển và gán tên cột, để viết tên cột cho csv mà chúng ta sử dụng . , trong khi ghi giá trị tệp phải được truyền bằng phương pháp từ điển, ở đây khóa là tên cột và giá trị là giá trị khóa tương ứng của bạn

import csv 

with open("D:\\sample.csv","w",newline="") as file_writer:

   fields=["Names","Age","Class"]

   writer=csv.DictWriter(file_writer,fieldnames=fields)

   writer.writeheader()

   writer.writerow({"Names":"John","Age":21,"Class":"12A"})

2

Máy tính xách tay Jupyter

Hãy nói rằng danh sách của bạn là A

Sau đó, bạn có thể mã quảng cáo sau đây, bạn sẽ có nó dưới dạng tệp csv (chỉ các cột!)

R="\n".join(A)
f = open('Columns.csv','w')
f.write(R)
f.close()

1

bạn nên sử dụng mô-đun CSV cho chắc chắn, nhưng rất có thể, bạn cần phải viết unicode. Đối với những người cần viết unicode, đây là lớp từ trang ví dụ, bạn có thể sử dụng như một mô-đun sử dụng:

import csv, codecs, cStringIO

class UTF8Recoder:
    """
    Iterator that reads an encoded stream and reencodes the input to UTF-8
    """
    def __init__(self, f, encoding):
        self.reader = codecs.getreader(encoding)(f)

def __iter__(self):
    return self

def next(self):
    return self.reader.next().encode("utf-8")

class UnicodeReader:
    """
    A CSV reader which will iterate over lines in the CSV file "f",
    which is encoded in the given encoding.
    """

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    f = UTF8Recoder(f, encoding)
    self.reader = csv.reader(f, dialect=dialect, **kwds)

def next(self):
    row = self.reader.next()
    return [unicode(s, "utf-8") for s in row]

def __iter__(self):
    return self

class UnicodeWriter:
    """
    A CSV writer which will write rows to CSV file "f",
    which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds):
    # Redirect output to a queue
    self.queue = cStringIO.StringIO()
    self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
    self.stream = f
    self.encoder = codecs.getincrementalencoder(encoding)()

def writerow(self, row):
    self.writer.writerow([s.encode("utf-8") for s in row])
    # Fetch UTF-8 output from the queue ...
    data = self.queue.getvalue()
    data = data.decode("utf-8")
    # ... and reencode it into the target encoding
    data = self.encoder.encode(data)
    # write to the target stream
    self.stream.write(data)
    # empty queue
    self.queue.truncate(0)

def writerows(self, rows):
    for row in rows:
        self.writerow(row)

1

Đây là một giải pháp khác không yêu cầu csvmô-đun.

print ', '.join(['"'+i+'"' for i in myList])

Thí dụ :

>>> myList = [u'value 1', u'value 2', u'value 3']
>>> print ', '.join(['"'+i+'"' for i in myList])
"value 1", "value 2", "value 3"

Tuy nhiên, nếu danh sách ban đầu chứa một số ", chúng sẽ không được thoát. Nếu được yêu cầu, có thể gọi một hàm để thoát nó như thế:

print ', '.join(['"'+myFunction(i)+'"' for i in myList])
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.