考虑一个文件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
导入。但是,该函数在第3行中看到了一个额外的列。我在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数据帧。
我可以在genfromtxt
和/或read_csv
中设置一个参数,让我忽略语音标记中的逗号吗?
我注意到read_csv
包含一个quotechar='"'
参数,由此定义:
quotechar :string(长度1)用于表示开头的字符 和引用项目的结尾。引用的项目可以包括分隔符和 它将被忽略。
这对我来说就像read_csv默认情况下应该适用于我的情况 - 但事实并非如此。
我可以看到我可以预先处理文件以删除逗号 - 如果可能的话我想避免使用它,但如果这是唯一的方法,欢迎提出建议。
答案 0 :(得分:13)
刚设法找到this:
我缺少的关键参数是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
这适用: - )
答案 1 :(得分: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)