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 ']
答案 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无法做到的各种其他事情。