numpy genfromtxt/pandas read_csv;忽略引号内的逗号

11 投票
2 回答
11179 浏览
提问于 2025-04-18 08:50

考虑一个文件,a.dat,里面的内容是:

address 1, address 2, address 3, num1, num2, num3
address 1, address 2, address 3, 1.0, 2.0, 3
address 1, address 2, "address 3, address4", 1.0, 2.0, 3

我正在尝试使用 numpy.genfromtxt 来导入数据。但是在第三行,函数发现多了一列。我在使用 pandas.read_csv 时也遇到了类似的错误:

np.genfromtxt('a.dat',delimiter=',',dtype=None,skiprows=1)

ValueError: Some errors were detected !
    Line #3 (got 7 columns instead of 6)

还有

pandas read_csv sort of works - but it gives me an unaligned data structure:

pd.read_csv('a.dat')

pandas.parser.CParserError: Error tokenizing data. C error: Expected 6 fields in line 3, saw 7

我正在寻找一个输入参数来解决这个问题。我不在乎最终得到的是 numpy 的 ndarray 还是 pandas 的 dataframe。

有没有什么参数可以在 genfromtxt 和/或 read_csv 中设置,让我可以忽略引号中的逗号?

我注意到 read_csv 有一个 quotechar='"' 参数,定义如下:

quotechar : 字符串(长度为1)用于表示引号项的开始和结束。引号中的内容可以包含分隔符,这些分隔符会被忽略。

这让我觉得 read_csv 默认情况下应该能处理我的情况,但实际上并没有。

我可以看到我可以先处理一下文件,把逗号去掉——如果可能的话,我希望避免这样做,但如果这是唯一的办法,我也欢迎建议。

2 个回答

2

Python自带的csv模块可以处理这种数据。

with open("a.dat") as f:
    reader = csv.reader(f, skipinitialspace=True)
    header = next(reader)
    dtype = numpy.dtype(zip(header, ['S20', 'S20', 'S20', 'f8', 'f8', 'f8']))
    data = numpy.fromiter(itertools.imap(tuple, reader), dtype=dtype)
21

我刚找到这个

我之前漏掉了一个重要的参数,就是 skipinitialspace=True - 这个参数的作用是“处理逗号后面的空格”

a=pd.read_csv('a.dat',quotechar='"',skipinitialspace=True)

   address 1  address 2            address 3  num1  num2  num3
0  address 1  address 2            address 3     1     2     3
1  address 1  address 2  address 3, address4     1     2     3

这样就可以用了 :-)

撰写回答