如何将Numpy数组的字符串(用逗号)保存到CSV?

时间:2013-12-17 01:40:37

标签: python arrays postgresql csv numpy

答案:答案:不要使用numpy。使用csv.writer代替numpy.savetxt

我是Python和NumPy的新手。将二维数组的字符串(包含逗号)保存到CSV文件似乎不是那么困难,但我不能按照我想要的方式工作。

假设我有一个看起来像这样的数组(由列表列表组成):

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

我想要一个在Excel(管道=单元格分隔符)中看起来像这样(或没有引号字符)的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 delimiter参数,但输出没有变化。

我需要手动执行此操作吗?如果是这样,请告诉我是否有任何捷径我应该知道。

最终,我需要将CSV导入Postgresql数据库。我并不完全清楚CSV格式化需要什么才能使其按预期工作,但我假设如果它在Excel中看起来不对,它可能最终会在Postgres中搞砸了。 Postgres documentation说:

  

每条记录中的值由DELIMITER字符分隔。如果   该值包含分隔符,QUOTE字符,   NULL字符串,回车符或换行符,然后是整数   value以QUOTE字符作为前缀和后缀,以及任何值   在QUOTE字符或ESCAPE的值内出现   字符前面有转义字符。你也可以使用   FORCE_QUOTE在输出非NULL值时强制引用   具体栏目。

谢谢!

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

实际输入和输出,如果它有相应的不同:

数组:

[['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 个答案:

答案 0 :(得分:3)

添加fmt="%s"不会在每个字段周围加上引号 - 引号是字符串%s的Python字符串文字的一部分,而%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无法做到的各种其他事情。