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

ems*_*ems 4 python csv arrays postgresql numpy

tl;dr 答案:不要使用 numpy。使用csv.writer而不是numpy.savetxt.

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

假设我有一个如下所示的数组(由列表列表组成):

[['text1, text2', 'text3'],
['text4', 'text5']]
Run Code Online (Sandbox Code Playgroud)

我想要一个在 Excel 中如下所示(或不带引号字符)的 CSV 文件(管道 = 单元格分隔符):

'text1, text2' | 'text3'
'text4'        | 'text5'
Run Code Online (Sandbox Code Playgroud)

我正在使用numpy.savetxt(filename, array, fmt="%s"),并得到以下 CSV 输出(带方括号):

['text1, text2','text3']
['text4','text5']
Run Code Online (Sandbox Code Playgroud)

在 Excel 中显示如下:

['text1  | text2' | 'text3']
['text4' | 'text5']
Run Code Online (Sandbox Code Playgroud)

我尝试使用 savetxt 分隔符参数,但输出没有变化。

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

最终,我需要将 CSV 导入 Postgresql 数据库。我并不完全清楚 CSV 格式需要什么才能按预期工作,但我假设如果它在 Excel 中看起来错误,它最终可能会在 Postgres 中变得混乱。Postgres 文档说:

每个记录中的值由 DELIMITER 字符分隔。如果该值包含分隔符、QUOTE 字符、NULL 字符串、回车符或换行符,则整个值将以 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 ']]
Run Code Online (Sandbox Code Playgroud)

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 ']
Run Code Online (Sandbox Code Playgroud)

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 ']                  
Run Code Online (Sandbox Code Playgroud)

aba*_*ert 6

添加fmt="%s"不会在每个字段周围添加引号\xe2\x80\x94,引号是 string 的 Python 字符串文字的一部分%s%s只是表示任何值都应格式化为字符串。如果您想对所有内容强制使用引号,则需要在格式字符串中添加引号,例如fmt=\'"%s"\'.

\n\n

但是,即使您不这样做,您显示的行也不可能产生您显示的输出。NumPy 无法将逗号更改为管道字符,或使用管道字符作为分隔符。您唯一可以获得的就是添加delimiter=\' |\'。如果您添加 \xe2\x80\xa6\xc2\xa0 它无需任何更改即可工作,您会得到以下结果:

\n\n
text1, text2 | text3\ntext4 | text5\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,无论您的实际问题是什么,它都不可能是您所描述的问题。

\n\n
\n\n

同时,如果您尝试尽可能灵活地为非数字数据编写 CSV 文件,标准库的csv模块比 NumPy 强大得多。NumPy\xe2\x80\x94顾名思义\xe2\x80\x94的优点在于处理数值数据。以下是如何做到这一点csv

\n\n
with open(filename, \'wb\') as f:\n    csv.writer(f).writerows(array)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将默认,作为分隔符。因为你的一些字符串有,中包含字符,因此默认情况下,它将引用这些字符串。但是您可以配置引用/转义行为、引号字符、分隔符以及 NumPy 无法配置的所有其他内容。

\n