numpy genfromtxt/pandas read_csv;忽略引号内的逗号
考虑一个文件,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
这样就可以用了 :-)