2014-10-19 46 views
2

我想將一個列表轉換爲csv,但是其中包含一些數據hava','。所以,當我寫將列表轉換爲csv,但數據中有','

with open('out.csv', 'w') as fp: 
    writer = csv.writer(fp,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') 
    writer.writerows(elements) 

元素是我的列表名稱,其中包含了「」被髮送到下一列的數據,但它是一個名稱的一部分。例如。 Smith, CA. SO CA移至下一列。 我能做什麼?

+2

將quotechar設置爲您的應用程序使用的引用機制 - 很可能是默認的'「' – ch3ka 2014-10-19 17:41:00

+0

您可以舉一個例子嗎?將代碼與列表'[['a','b,c','d '],[1,2,3]]'帶有分隔符'',''和'QUOTE_MINIMAL',它對我來說非常合適,爲什麼不適合你? – 2014-10-19 17:49:57

+0

@RayToal在MS Excel中打開文件後,將看到b和c在不同的列上,然後嘗試使用Tim Pietzcker的解決方案 (在MS Excel 2007上測試) – 2014-10-19 17:53:49

回答

3

首先,您應該使用newline=''參數打開文件(請閱讀文檔csv module)。

然後,選擇"爲您報價性格讓其他CSV工具(EXCEL)指出預計報價可以做出正確的反應到您的文件:

with open('out.csv', 'w', newline='') as fp: 
    writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') 
    writer.writerows(elements) 
0

使用csv.QUOTE_ALL

documentation

csv.QUOTE_ALL 
Instructs writer objects to quote all fields. 

如果您使用的是特殊的報價字符,需要進行配置,您使用的讀取CSV應用程序使用它作爲引號字符

+1

'QUOTE_ALL'是不必要的。 'QUOTE_MINIMAL'已經引用了所需的所有字段。 – 2014-10-19 17:45:12

0

這裏的工作例如,但請注意,如有人評論,這在Excel中不可讀。

import csv 

elements = [['Last1, First1','City, State',12345,'111-22-3333','Embedded|Quote'], 
      ['Last2, First2','City, State',12345,'111-22-3333','Embedded|Quote'], 
      ['Last3, First3','City, State',12345,'111-22-3333','Embedded|Quote'], 
      ['Last4, First4','City, State',12345,'111-22-3333','Embedded|Quote']] 

with open('out.csv', 'w', newline='') as fp: 
    writer = csv.writer(fp,delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') 
    writer.writerows(elements) 

with open('out.csv') as fp: 
    print(fp.read()) 

with open('out.csv', 'r', newline='') as fp: 
    reader = csv.reader(fp, quotechar='|') 
    for line in reader: 
     print(line) 

輸出:

|Last1, First1|,|City, State|,12345,111-22-3333,|Embedded||Quote| 
|Last2, First2|,|City, State|,12345,111-22-3333,|Embedded||Quote| 
|Last3, First3|,|City, State|,12345,111-22-3333,|Embedded||Quote| 
|Last4, First4|,|City, State|,12345,111-22-3333,|Embedded||Quote| 

['Last1, First1', 'City, State', '12345', '111-22-3333', 'Embedded|Quote'] 
['Last2, First2', 'City, State', '12345', '111-22-3333', 'Embedded|Quote'] 
['Last3, First3', 'City, State', '12345', '111-22-3333', 'Embedded|Quote'] 
['Last4, First4', 'City, State', '12345', '111-22-3333', 'Embedded|Quote'] 

如果你真的想打開.csv Excel文件,使用默認參數dialect。你encoding='utf-8-sig'還支持非ASCII字符,並且還提供了字節順序標記(BOM)簽名Excel需要正確讀取的.csv:

#! coding=utf8 
import csv 

elements = [['Last1, First1','City, State',12345,'111-22-3333','Embedded"Quote'], 
      ['多路能, 馬克','City, State',12345,'111-22-3333','Embedded"Quote'], 
      ['Last3, First3','City, State',12345,'111-22-3333','Embedded"Quote'], 
      ['Last4, First4','City, State',12345,'111-22-3333','Embedded"Quote']] 

with open('out.csv', 'w', encoding='utf-8-sig', newline='') as fp: 
    writer = csv.writer(fp) 
    writer.writerows(elements) 

with open('out.csv','rb') as fp: 
    print(fp.read().decode()) 

with open('out.csv', 'r', encoding='utf-8-sig', newline='') as fp: 
    reader = csv.reader(fp) 
    for line in reader: 
     print(line) 

輸出:

"Last1, First1","City, State",12345,111-22-3333,"Embedded""Quote" 
"多路能, 馬克","City, State",12345,111-22-3333,"Embedded""Quote" 
"Last3, First3","City, State",12345,111-22-3333,"Embedded""Quote" 
"Last4, First4","City, State",12345,111-22-3333,"Embedded""Quote" 

['Last1, First1', 'City, State', '12345', '111-22-3333', 'Embedded"Quote'] 
['多路能, 馬克', 'City, State', '12345', '111-22-3333', 'Embedded"Quote'] 
['Last3, First3', 'City, State', '12345', '111-22-3333', 'Embedded"Quote'] 
['Last4, First4', 'City, State', '12345', '111-22-3333', 'Embedded"Quote'] 
0

的具有值將被引用,將自動引用。例如,如果使用,作爲分隔符,則必須引用值「Smith,CA」,因爲它包含,

你的問題沒有說明elements變量的外觀,所以我在這裏猜測。如果你有一個迭代元素,每個元素看起來像['Smith, CA', 1, someothervalue],你發佈的代碼工作得很好。我完成你的代碼示例如下:

import csv 

elements = [['Smith, CA', 1, 'salad'], ['Doe, NY', 2, 'soup']] 

with open('out.csv', 'w') as fp: 
    writer = csv.writer(fp, delimiter=',', quotechar='|', quoting=csv.QUOTE_MINIMAL, lineterminator='\n') 
    writer.writerows(elements) 

這將產生以下的輸出:

|Smith, CA|,1,salad 
|Doe, NY|,2,soup 

注1:由於您使用quoting=csv.QUOTE_MINIMAL,只珍視需要被引述將會。其他值如1'salad'未被引用。

注2:使用|作爲quotechar並不常見,正如@TimPietzcker剛剛提到的那樣。但它的工作。