我试图使用熊猫操作.csv文件,但我得到这个错误:
pandas.parser.CParserError:标记数据错误。C错误:第3行有2个字段,见12
我试着读过熊猫的文件,但一无所获。
我的代码很简单:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
我该如何解决这个问题?我应该使用csv模块还是其他语言?
文件来自晨星公司
我试图使用熊猫操作.csv文件,但我得到这个错误:
pandas.parser.CParserError:标记数据错误。C错误:第3行有2个字段,见12
我试着读过熊猫的文件,但一无所获。
我的代码很简单:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
我该如何解决这个问题?我应该使用csv模块还是其他语言?
文件来自晨星公司
当前回答
这看起来很丑,但你会有你的数据框架
import re
path = 'GOOG Key Ratios.csv'
try:
data = pd.read_csv(path)
except Exception as e:
val = re.findall('tokenizing.{1,100}\s*Expected\s*(\d{1,2})\s*',str(e),re.I)
data = pd.read_csv(path, skiprows=int(val[0])-1)
其他回答
我也遇到过同样的问题。在同一个源文件上使用pd.read_table()似乎可以工作。我找不到原因,但对我的情况来说,这是一个有用的变通办法。也许有更博学的人能解释清楚为什么它能起作用。
编辑: 我发现,当文件中的某些文本与实际数据的格式不一致时,这个错误就会出现。这通常是页眉或页脚信息(大于一行,所以skip_header不起作用),它们不会被与实际数据相同数量的逗号分隔(当使用read_csv时)。使用read_table使用制表符作为分隔符,可以避免用户当前错误,但引入其他错误。
我通常通过将额外的数据读入文件,然后使用read_csv()方法来解决这个问题。
具体的解决方案可能因您的实际文件而异,但这种方法在一些情况下对我来说是有效的
我遇到过这样的错误,一个丢失的引号。我使用映射软件,当导出以逗号分隔的文件时,它会在文本项周围加上引号。使用引号的文本(例如:' =英尺和' =英寸)可能会导致分隔符冲突。考虑下面这个例子,5英寸的测井曲线打印很差:
UWI_key,经度,纬度,备注 US42051316890000, 30.4386484, -96.4330734,“可怜的5””
用5英寸作为5英寸的简写,最终会给工作带来麻烦。Excel会简单地去掉额外的引号,但是Pandas没有上面提到的error_bad_lines=False参数就会失效。
标记数据错误。C错误:第3行有2个字段,见12
这个错误给出了解决问题“Expected 2 fields in line 3, saw 12”的线索,saw 12表示第二行长度为12,第一行长度为2。
当您有如下所示的数据时,如果您跳过行,那么大部分数据将被跳过
data = """1,2,3
1,2,3,4
1,2,3,4,5
1,2
1,2,3,4"""
如果您不想跳过任何行,请执行以下操作
#First lets find the maximum column for all the rows
with open("file_name.csv", 'r') as temp_f:
# get No of columns in each line
col_count = [ len(l.split(",")) for l in temp_f.readlines() ]
### Generate column names (names will be 0, 1, 2, ..., maximum columns - 1)
column_names = [i for i in range(max(col_count))]
import pandas as pd
# inside range set the maximum value you can see in "Expected 4 fields in line 2, saw 8"
# here will be 8
data = pd.read_csv("file_name.csv",header = None,names=column_names )
使用range而不是手动设置名称,因为当您有很多列时,这样做会很麻烦。
此外,如果需要使用均匀的数据长度,可以将NaN值填充为0。如。对于聚类(k-means)
new_data = data.fillna(0)
您的CSV文件可能有可变的列数,read_csv从前几行推断出列数。在这种情况下有两种解决方法:
1)将CSV文件更改为具有最大列数的虚拟第一行(并指定header=[0])
2)或者使用names = list(range(0,N)),其中N是最大列数。
虽然这个问题并非如此,但压缩数据也可能出现此错误。显式地设置kwarg压缩值解决了我的问题。
result = pandas.read_csv(data_source, compression='gzip')