2012-02-06 35 views
61

Tôi muốn truyền dữ liệu như [1,2,'a','He said "what do you mean?"'] đến chuỗi được định dạng csv.Làm cách nào để ghi dữ liệu vào định dạng csv dưới dạng chuỗi (không phải tệp)?

Thông thường, người dùng sẽ sử dụng csv.writer() vì điều này xử lý tất cả các trường hợp cạnh điên (thoát dấu phẩy, thoát dấu ngoặc kép, phương ngữ CSV, v.v.) Bắt giữ là csv.writer() sẽ xuất ra đối tượng tệp chứ không phải chuỗi.

giải pháp hiện tại của tôi là chức năng hơi hacky này:

def CSV_String_Writeline(data): 
    class Dummy_Writer: 
     def write(self,instring): 
      self.outstring = instring.strip("\r\n") 
    dw = Dummy_Writer() 
    csv_w = csv.writer(dw) 
    csv_w.writerow(data) 
    return dw.outstring 

bất cứ ai có thể đưa ra một giải pháp thanh lịch mà vẫn xử lý các trường hợp cạnh tốt không?

Edit: Đây là cách tôi đã kết thúc làm việc đó:

def csv2string(data): 
    si = StringIO.StringIO() 
    cw = csv.writer(si) 
    cw.writerow(data) 
    return si.getvalue().strip('\r\n') 

Trả lời

39

Bạn có thể sử dụng StringIO thay vì riêng Dummy_Writer của bạn:

This module implements a file-like class, StringIO , that reads and writes a string buffer (also known as memory files).

Ngoài ra còn có cStringIO, mà là một phiên bản nhanh hơn của StringIO lớp học.

79

Trong Python 3:

>>> import io 
>>> import csv 
>>> output = io.StringIO() 
>>> csvdata = [1,2,'a','He said "what do you mean?"',"Whoa!\nNewlines!"] 
>>> writer = csv.writer(output, quoting=csv.QUOTE_NONNUMERIC) 
>>> writer.writerow(csvdata) 
59 
>>> output.getvalue() 
'1,2,"a","He said ""what do you mean?""","Whoa!\nNewlines!"\r\n' 

Một số chi tiết cần phải được thay đổi một chút cho Python 2:

>>> output = io.BytesIO() 
>>> writer = csv.writer(output) 
>>> writer.writerow(csvdata) 
57L 
>>> output.getvalue() 
'1,2,a,"He said ""what do you mean?""","Whoa!\nNewlines!"\r\n' 
+0

Ví dụ tốt. :) Là một sidenote, hành vi thông thường khi gặp phải dòng mới trong một tệp CSV là gì? '\ N' có ở giữa dữ liệu không, nhưng' \ r \ n' cho biết kết thúc bản ghi bất kể nó xuất hiện ở đâu? (Giả sử bạn đang ở trên một nền tảng sử dụng '\ r \ n' như là người kết thúc dòng.) –

+0

Tôi không chắc chắn. Tôi đã có thể mong đợi '\ r \ n' bản thân mình vì tham số mặc định cho' io.StringIO() 'là' newline = None' cho phép chế độ dòng mới phổ quát, sẽ tự động sử dụng kiểu dòng mới chính xác theo nền tảng của bạn. Tôi hơi bối rối bởi hành vi này. –

+0

@ Li-aungYip: Tôi đã mở [câu hỏi về điều này] (http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules). –

0

Dưới đây là phiên bản mà làm việc cho utf-8. csvline2string cho chỉ một dòng, không xuống hàng cuối cùng, csv2string cho nhiều dòng, với linebreaks:

import csv, io 

def csvline2string(one_line_of_data): 
    si = BytesIO.StringIO() 
    cw = csv.writer(si) 
    cw.writerow(one_line_of_data) 
    return si.getvalue().strip('\r\n') 

def csv2string(data): 
    si = BytesIO.StringIO() 
    cw = csv.writer(si) 
    for one_line_of_data in data: 
     cw.writerow(one_line_of_data) 
    return si.getvalue() 
-1
import csv 
from StringIO import StringIO 
with open('file.csv') as file: 
    file = file.read() 

stream = StringIO(file) 

csv_file = csv.DictReader(stream) 
+2

Câu trả lời chỉ có mã không được khuyến khích, bạn nên thêm một số giải thích cho câu trả lời của mình – Raniz

1

Tôi tìm thấy câu trả lời, tất cả trong tất cả, một chút bối rối. Đối với Python 2, cách sử dụng này hiệu quả với tôi:

import csv, io 

def csv2string(data): 
    si = io.BytesIO() 
    cw = csv.writer(si) 
    cw.writerow(data) 
    return si.getvalue().strip('\r\n') 

data=[1,2,'a','He said "what do you mean?"'] 
print csv2string(data) 
Các vấn đề liên quan