如何将numpy字符串数组(带逗号)保存到CSV?

2024-05-13 21:15:50 发布

您现在位置:Python中文网/ 问答频道 /正文

答:不要用核弹。使用csv.writer而不是numpy.savetxt

我对Python和NumPy还不熟悉。似乎将二维字符串数组(包含逗号)保存到CSV文件中并不难,但我无法使它按我所希望的方式工作。

假设我有一个类似这样的数组(由列表列表组成):

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

我想要一个CSV文件,在Excel(管道=单元格分隔符)中是这样的(或没有引号字符):

'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说:

The values in each record are separated by the DELIMITER character. If the value contains the delimiter character, the QUOTE character, the NULL string, a carriage return, or line feed character, then the whole value is prefixed and suffixed by the QUOTE character, and any occurrence within the value of a QUOTE character or the ESCAPE character is preceded by the escape character. You can also use FORCE_QUOTE to force quotes when outputting non-NULL values in specific columns.

谢谢!

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

实际输入和输出,以防它们有相关的不同:

数组:

[['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 ']                  

Tags: ofcsvthebyvalue数组excelquote
1条回答
网友
1楼 · 发布于 2024-05-13 21:15:50

添加fmt="%s"不会在每个字段周围加引号,引号是字符串%s的Python字符串文本的一部分,而%s只是说任何值都应该格式化为字符串。如果你想在所有东西周围加引号,你需要用格式字符串的引号,比如fmt='"%s"'

然而,即使你不这样做,你显示的行不可能产生你显示的输出。NumPy不可能将逗号更改为管道字符,也不可能使用管道字符作为分隔符。你唯一能得到的就是添加delimiter=' |。如果你加上这个…它不会改变,你会得到:

text1, text2 | text3
text4 | text5

所以不管你真正的问题是什么,都不可能是你描述的那个。


同时,如果您试图尽可能灵活地为非数字数据编写CSV文件,那么标准库的^{}模块比NumPy强大得多。顾名思义,NumPy的优势在于处理数值数据。下面介绍如何使用csv

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

这将默认为,作为分隔符。由于某些字符串中有,字符,默认情况下,它会引用这些字符串。但是您可以配置引用/转义行为、引用字符、分隔符以及NumPy不能配置的所有其他东西

相关问题 更多 >