我试图使用熊猫操作.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模块还是其他语言?
文件来自晨星公司
当前回答
试题:熊猫。read_csv(path, sep = ',',header=None)
其他回答
标记数据错误。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文件的第一行和最后两行格式与文件的中间内容不同。
因此,我所做的是将csv文件作为字符串打开,解析字符串的内容,然后使用read_csv获取数据帧。
import io
import pandas as pd
file = open(f'{file_path}/{file_name}', 'r')
content = file.read()
# change new line character from '\r\n' to '\n'
lines = content.replace('\r', '').split('\n')
# Remove the first and last 2 lines of the file
# StringIO can be considered as a file stored in memory
df = pd.read_csv(StringIO("\n".join(lines[2:-2])), header=None)
检查是否使用正确的分隔符加载csv。
df = pd.read_csv(csvname, header=0, sep=",")
你可以使用:
pd.read_csv("mycsv.csv", delimiter=";")
熊猫1.4.4
它可以是文件的分隔符,将其作为文本文件打开,查找分隔符。然后,您将拥有可以为空且未命名的列,因为行包含太多分隔符。
因此,您可以使用pandas来处理它们并检查值。对我来说,这比在我的情况下跳过台词要好。
在处理类似的解析错误时,我发现另一种方法很有用,它使用CSV模块将数据重新路由到pandas df。例如:
import csv
import pandas as pd
path = 'C:/FileLocation/'
file = 'filename.csv'
f = open(path+file,'rt')
reader = csv.reader(f)
#once contents are available, I then put them in a list
csv_list = []
for l in reader:
csv_list.append(l)
f.close()
#now pandas has no problem getting into a df
df = pd.DataFrame(csv_list)
我发现CSV模块对于格式不佳的逗号分隔的文件更加健壮,因此已经成功地用这种方法解决了诸如此类的问题。