2012-02-06 104 views
61

我想將類似[1,2,'a','He said "what do you mean?"']的數據轉換爲csv格式的字符串。如何將數據寫入csv格式爲字符串(不是文件)?

通常人們會用csv.writer()對於這一點,因爲它處理了所有的瘋狂邊緣的情況下(逗號逃脫,引號逃逸,CSV方言等),美中不足的是,csv.writer()預計將輸出到文件的對象,而不是一個串。

我目前的解決辦法是這個有點哈克功能:

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 

誰能給一個更優雅的解決方案,還是處理邊界情況呢?

編輯:這就是我最後做它:

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

回答

39

你可以使用StringIO,而不是你自己的Dummy_Writer

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

還有cStringIO,這是在一個更快的版本StringIO類。

79

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

一些細節需要修改一下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

很好的例子。 :) 作爲旁註,當在CSV文件中遇到換行符時,通常的行爲是什麼? \ n \ n可以確定在數據中間,但是\ r \ n'表示記錄結束,無論它出現在哪裏? (假設你在使用'\ r \ n'作爲行結束符的平臺上)。 – 2012-02-06 08:35:53

+0

我不確定。我本該期待'\ r \ n',因爲'io.StringIO()'的默認參數是'newline = None',它啓用了通用換行符模式,該模式應該根據您的平臺自動使用正確的換行符樣式。我自己對這種行爲感到困惑。 – 2012-02-06 08:46:33

+0

@ Li-aungYip:我打開了一個[關於這個問題](http://stackoverflow.com/questions/9157623/unexpected-behavior-of-universal-newline-mode-with-stringio-and-csv-modules )。 – 2012-02-06 08:55:33

0

下面是對用UTF-8版本。 csvline2string只是一條線,結尾沒有換行符,csv2string了很多線,換行:

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

不提供代碼的答案,您應該在答案中添加一些說明 – Raniz 2015-06-10 04:23:14

1

我找到了答案,這一切的一切,有點混亂。對於Python 2,這種用法對我有用:

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)