2013-12-17 50 views
1

tl; dr答案:不要使用numpy。使用csv.writer而不是numpy.savetxt如何將字符串(包含逗號)的numpy數組保存爲CSV?

我是Python和NumPy的新手。看起來,將二維數組字符串(包含逗號)保存爲CSV文件應該不是那麼困難,但我無法按照自己的想法使其工作。

比方說,我有一個數組,看起來像這樣(從列表的列表中進行):在Excel中

[['text1, text2', 'text3'], 
['text4', 'text5']] 

我想一個CSV文件看起來像這樣(或沒有引號)(管=電池隔膜):

'text1, text2' | 'text3' 
'text4'  | 'text5' 

我使用numpy.savetxt(filename, array, fmt="%s"),我得到以下CSV輸出(方括號):

['text1, text2','text3'] 
['text4','text5'] 

該款顯示器在Excel這樣的:

['text1 | text2' | 'text3'] 
['text4' | 'text5'] 

我試圖與savetxt分隔符參數大驚小怪,但在輸出沒有變化。

我是否需要手動執行此操作?如果是這樣,讓我知道是否有任何我應該知道的捷徑。

最終,我需要將CSV導入到Postgresql數據庫中。我並不完全清楚CSV格式需要如何才能按預期工作,但我假設它在Excel中看起來錯誤,它可能最終會在Postgres中搞砸。 Postgres documentation說:

每個記錄中的值由DELIMITER字符分隔。如果 的值包含分隔符,QUOTE字符,NULL字符串,回車符或換行符,則整個 值的前綴爲後綴QUOTE字符,並且任何發生在值QUOTE字符或ESCAPE 字符前面是轉義字符。在 特定列中輸出非空值時,您還可以使用 FORCE_QUOTE強制引用。

謝謝!

++++++++++++++++++++++++++++

真實的輸入和輸出,在情況下,它貼切不同:

陣列:

[['8908232', 'Plant Growth Chamber Facility at the Department of Botany, University of Wisconsin-Madison', 'DBI', 'INSTRUMENTAT & INSTRUMENT DEVP', '1/1/90', '12/19/89', 'WI', 'Standard Grant', 'Joann P. Roskoski', '12/31/91', '$94,914.00 ', 'BIO', '1108', '', '$0.00 ']] 

CSV輸出:

['8908232', 'Plant Growth Chamber Facility at the Department of Botany, University of Wisconsin-Madison', 'DBI', 'INSTRUMENTAT & INSTRUMENT DEVP', '1/1/90', '12/19/89', 'WI', 'Standard Grant', 'Joann P. Roskoski', '12/31/91', '$94,914.00 ', 'BIO', '1108', '', '$0.00 '] 

Excel的版本:

['8908232' 'Plant Growth Chamber Facility at the Department of Botany University of Wisconsin-Madison' 'DBI' 'INSTRUMENTAT & INSTRUMENT DEVP' '1/1/90' '12/19/89' 'WI' 'Standard Grant' 'Joann P. Roskoski'  '12/31/91' '$94 914.00 '  'BIO' '1108' '' '$0.00 ']     
+1

嗯,這可能是Python擅長的事情之一,而不是_NumPy_的好處之一。 stdlib中的['csv'](http://docs.python.org/3/library/csv.html)模塊用於處理在CSV文件中以CSV的每種合理方言編寫和解析各種字符串。 'np.savetxt'被設計爲處理將數字數組寫入簡單的CSV方言... – abarnert

+0

此外,您不會爲該代碼獲得該輸出。向我們展示您的實際代碼和您的實際輸出,或者我們無法告訴您您確實做錯了什麼。 – abarnert

+0

增加了上面的實際輸出,並進一步闡明瞭這個問題。 Numpy.savetxt被實驗室中的某個人推薦給我,但你說得對,csv.writer更好。 – ems

回答

3

添加fmt="%s"不把周圍每個引號現場的報價是Python字符串的一部分文字的字符串%s%s只是說,任何數值應該被格式化爲一個字符串。如果您想強制引用任何內容,則需要使用格式字符串中的引號,如fmt='"%s"'

但是,即使您沒有這樣做,您展示的這一行也無法產生您展示的輸出。 NumPy沒有辦法將你的逗號變成管道字符,或者使用管道字符作爲分隔符。唯一的你可以通過加入delimiter=' |'來獲得。如果您添加了...它的工作原理沒有變化,你會得到這樣的:

text1, text2 | text3 
text4 | text5 

所以,無論你的實際的問題是,它不能是你所描述的。


同時,如果你想要寫非數字數據儘可能靈活CSV文件,標準庫的csv模塊比NumPy的功能更加強大。 NumPy的優點 - 顧名思義 - 是在處理數字數據。以下是如何與csv做到這一點:

with open(filename, 'wb') as f: 
    csv.writer(f).writerows(array) 

這將默認爲,作爲分隔符。由於某些字符串中有,個字符,因此默認情況下會引用這些字符串。但是,您可以配置引用/轉義行爲,引號字符,分隔符以及NumPy無法做到的其他所有事情。

+0

爲什麼'fmt ='%s''是默認的?它是'fmt ='%。18e'',所以OP的'fmt'參數不僅影響輸出,它是必需的(對於字符串數組)。 – askewchan

+0

@askewchan:你是對的;我認爲默認是dtype特定的,但事實並非如此。我會編輯它。但重點是,它不會做他想做的事情,也就是在字段周圍添加引號。 – abarnert

+0

@askewchan:當然,這是無視事實,他現有的代碼沒有問題,他要求我們解決無論如何,所以我不知道爲什麼我們試圖回答它... – abarnert

相關問題