使用numpy.genfromtxt读取包含逗号的字符串的csv文件

Cra*_*igO 29 python numpy pandas genfromtxt

我试图读取一个csv文件,numpy.genfromtxt但有些字段是包含逗号的字符串.字符串是引号,但是numpy没有将引号识别为定义单个字符串.例如,使用't.csv'中的数据:

2012, "Louisville KY", 3.5
2011, "Lexington, KY", 4.0
Run Code Online (Sandbox Code Playgroud)

代码

np.genfromtxt('t.csv', delimiter=',')
Run Code Online (Sandbox Code Playgroud)

产生错误:

ValueError:检测到一些错误!第2行(有4列而不是3列)

我正在寻找的数据结构是:

array([['2012', 'Louisville KY', '3.5'],
       ['2011', 'Lexington, KY', '4.0']], 
      dtype='|S13')
Run Code Online (Sandbox Code Playgroud)

查看文档,我没有看到任何处理此问题的选项.有没有办法用numpy做,或者我只需要用csv模块读取数据然后将其转换为numpy数组?

jor*_*ris 21

您可以使用pandas(成为使用科学python中的数据帧(异构数据)的默认库).它read_csv可以解决这个问题.来自文档:

quotechar:string

The character to used to denote the start and end of a quoted item. Quoted items 
can include the delimiter and it will be ignored.
Run Code Online (Sandbox Code Playgroud)

默认值为".一个例子:

In [1]: import pandas as pd

In [2]: from StringIO import StringIO

In [3]: s="""year, city, value
   ...: 2012, "Louisville KY", 3.5
   ...: 2011, "Lexington, KY", 4.0"""

In [4]: pd.read_csv(StringIO(s), quotechar='"', skipinitialspace=True)
Out[4]:
   year           city  value
0  2012  Louisville KY    3.5
1  2011  Lexington, KY    4.0
Run Code Online (Sandbox Code Playgroud)

这里的诀窍是你还必须用skipinitialspace=True逗号分隔符来处理空格.

除了强大的csv阅读器之外,我还强烈建议将pandas与你拥有的异构数据一起使用(你给出的numpy中的示例输出都是字符串,尽管你可以使用结构化数组).


Bit*_*ise 12

额外逗号的问题np.genfromtxt并没有解决这个问题.

一个简单的解决方案是使用csv.reader()python的csv模块将文件读入列表,然后根据需要将其转储到numpy数组中.

如果你真的想要使用np.genfromtxt,请注意它可以采用迭代器而不是文件,例如np.genfromtxt(my_iterator, ...).因此,您可以csv.reader在迭代器中包装并将其赋予np.genfromtxt.

这将是这样的:

import csv
import numpy as np

np.genfromtxt(("\t".join(i) for i in csv.reader(open('myfile.csv'))), delimiter="\t")
Run Code Online (Sandbox Code Playgroud)

这实际上只是用标签替换了相应的逗号.


Mic*_*rin 5

如果您使用的是 numpy,您可能想使用 numpy.ndarray。这会给你一个 numpy.ndarray:

import pandas
data = pandas.read_csv('file.csv').as_matrix()
Run Code Online (Sandbox Code Playgroud)

Pandas 将正确处理“列克星敦,肯塔基州”案例

  • `as_matrix()` 将很快被弃用。请改用“.values”。 (2认同)