abu*_*eau 284 python csv pandas
我正在尝试使用pandas来操作.csv文件,但是我收到此错误:
pandas.parser.CParserError:标记数据时出错.C错误:第3行预计有2个字段,见12
我曾尝试阅读熊猫文档,但一无所获.
我的代码很简单:
path = 'GOOG Key Ratios.csv'
#print(open(path).read())
data = pd.read_csv(path)
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?我应该使用该csv
模块还是其他语言?
档案来自晨星
ric*_*hie 426
你也可以试试;
data = pd.read_csv('file1.csv', error_bad_lines=False)
Run Code Online (Sandbox Code Playgroud)
gri*_*tis 77
这可能是一个问题
要解决它,请尝试在调用时指定sep
和/或header
参数read_csv
.例如,
df = pandas.read_csv(fileName, sep='delimiter', header=None)
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,sep
定义了分隔符并header=None
告诉pandas您的源数据没有标题/列标题的行.因此,文档说:"如果文件不包含标题行,那么你应该显式传递header = None".在这种情况下,pandas会自动为每个字段{0,1,2,...}创建整数索引.
根据文档,分隔符应该不是问题.文档说"如果sep为None [未指定],将尝试自动确定这个." 然而,我对此并没有好运,包括具有明显分隔符的实例.
Tom*_*ger 39
解析器被文件的标题弄糊涂了.它读取第一行并推断该行的列数.但前两行不代表文件中的实际数据.
尝试一下 data = pd.read_csv(path, skiprows=2)
小智 28
您的CSV文件可能具有可变数量的列,并read_csv
推断出前几行中的列数.在这种情况下解决它的两种方法:
1)将CSV文件更改为具有最大列数的虚拟第一行(并指定header=[0]
)
2)或使用names = list(range(0,N))
N是最大列数的地方.
Piy*_*are 17
这绝对是分隔符的问题,因为大多数csv CSV都是使用创建的,sep='/t'
所以尝试使用分隔符read_csv
使用制表(\t)
符/t
.所以,尝试使用以下代码行打开.
data=pd.read_csv("File_path", sep='\t')
Run Code Online (Sandbox Code Playgroud)
小智 16
我也有这个问题,但也许是出于其他原因.我的CSV中有一些尾随逗号,它们添加了一个pandas试图阅读的附加列.使用以下工作,但它只是忽略坏线:
data = pd.read_csv('file1.csv', error_bad_lines=False)
Run Code Online (Sandbox Code Playgroud)
如果你想保持线条是一种丑陋的黑客来处理错误就是做如下的事情:
line = []
expected = []
saw = []
cont = True
while cont == True:
try:
data = pd.read_csv('file1.csv',skiprows=line)
cont = False
except Exception as e:
errortype = e.message.split('.')[0].strip()
if errortype == 'Error tokenizing data':
cerror = e.message.split(':')[1].strip().replace(',','')
nums = [n for n in cerror.split(' ') if str.isdigit(n)]
expected.append(int(nums[0]))
saw.append(int(nums[2]))
line.append(int(nums[1])-1)
else:
cerror = 'Unknown'
print 'Unknown Error - 222'
if line != []:
# Handle the errors however you want
Run Code Online (Sandbox Code Playgroud)
我开始编写一个脚本来将行重新插入到DataFrame中,因为坏行将由上面代码中的变量"line"给出.只需使用csv阅读器就可以避免这一切.希望大熊猫开发人员能够在未来更轻松地处理这种情况.
Dir*_*irk 14
以下对我有用(我发布了这个答案,因为我在 Google Colaboratory Notebook 中特别遇到了这个问题):
df = pd.read_csv("/path/foo.csv", delimiter=';', skiprows=0, low_memory=False)
Run Code Online (Sandbox Code Playgroud)
Ste*_*ouk 11
我遇到了这个问题,我试图在不传递列名的情况下读取CSV文件。
df = pd.read_csv(filename, header=None)
Run Code Online (Sandbox Code Playgroud)
我事先在列表中指定了列名称,然后将它们传递给names
,它立即解决了它。如果您没有设置列名,则可以创建与数据中可能存在的最大列数一样多的占位符名称。
col_names = ["col1", "col2", "col3", ...]
df = pd.read_csv(filename, names=col_names)
Run Code Online (Sandbox Code Playgroud)
elP*_*tor 10
我自己有几次这个问题.几乎每次,原因是我试图打开的文件不是一个正确保存的CSV开始.并且通过"正确",我的意思是每行具有相同数量的分隔符或列.
通常它发生是因为我在Excel中打开了CSV然后不正确地保存了它.即使文件扩展名仍为.csv,纯CSV格式也已更改.
使用pandas to_csv保存的任何文件都将正确格式化,不应该出现此问题.但是如果你用另一个程序打开它,它可能会改变结构.
希望有所帮助.
amr*_*sen 10
标记数据时出错。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"""
Run Code Online (Sandbox Code Playgroud)
如果您不想跳过任何行,请执行以下操作
#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 )
Run Code Online (Sandbox Code Playgroud)
使用范围而不是手动设置名称,因为当您有很多列时,它会很麻烦。
此外,如果需要使用偶数数据长度,您可以用 0 填充 NaN 值。例如。用于聚类(k-means)
new_data = data.fillna(0)
Run Code Online (Sandbox Code Playgroud)
小智 10
你可以试试;
data = pd.read_csv('file1.csv', sep='\t')
Run Code Online (Sandbox Code Playgroud)
我遇到了同样的问题.使用pd.read_table()
相同的源文件似乎工作.我无法追查其原因,但这对我的案例来说是一个有用的解决方法.也许知识渊博的人可以更清楚地了解其工作原理.
编辑:我发现当您的文件中有一些文本与实际数据格式不同时,此错误会逐渐消失.这通常是页眉或页脚信息(大于一行,因此skip_header不起作用),它们不会被与实际数据相同数量的逗号分隔(使用read_csv时).使用read_table使用选项卡作为分隔符,可以绕过用户当前错误但引入其他错误.
我通常通过将额外数据读入文件然后使用read_csv()方法来解决这个问题.
确切的解决方案可能会因您的实际文件而异,但在某些情况下,这种方法对我有用
小智 7
我使用的数据集有很多引号 (") 使用了与格式无关的格式。我能够通过包含以下参数来修复错误read_csv()
:
quoting=3 # 3 correlates to csv.QUOTE_NONE for pandas
Run Code Online (Sandbox Code Playgroud)
据我所知,在查看您的文件后,问题是您尝试加载的 csv 文件有多个表。有空行或包含表格标题的行。尝试看看这个Stackoverflow 答案。它展示了如何以编程方式实现这一目标。
另一种动态方法是使用csv 模块,一次读取每一行并进行完整性检查/正则表达式,以推断该行是否为(标题/标题/值/空白)。使用这种方法还有一个优势,即您可以根据需要在 python 对象中拆分/追加/收集数据。
最简单的方法是在手动选择表格并将其复制到剪贴板后使用 pandas 函数pd.read_clipboard()
,以防您可以在 Excel 或其他内容中打开 csv。
无关紧要:
另外,与你的问题无关,但因为没有人提到这一点:我在加载一些数据集(例如seeds_dataset.txt
来自 UCI 的数据集)时遇到了同样的问题。就我而言,发生错误是因为某些分隔符的空格比真正的 tab 多\t
。例如,参见下面的第 3 行
14.38 14.21 0.8951 5.386 3.312 2.462 4.956 1
14.69 14.49 0.8799 5.563 3.259 3.586 5.219 1
14.11 14.1 0.8911 5.42 3.302 2.7 5 1
Run Code Online (Sandbox Code Playgroud)
因此,请使用\t+
in 分隔符模式而不是\t
.
14.38 14.21 0.8951 5.386 3.312 2.462 4.956 1
14.69 14.49 0.8799 5.563 3.259 3.586 5.219 1
14.11 14.1 0.8911 5.42 3.302 2.7 5 1
Run Code Online (Sandbox Code Playgroud)
小智 6
在参数中使用分隔符
pd.read_csv(filename, delimiter=",", encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
它会读。
对于那些在 Linux 操作系统上使用 Python 3 遇到类似问题的人。
pandas.errors.ParserError: Error tokenizing data. C error: Calling
read(nbytes) on source failed. Try engine='python'.
Run Code Online (Sandbox Code Playgroud)
尝试:
df.read_csv('file.csv', encoding='utf8', engine='python')
Run Code Online (Sandbox Code Playgroud)
我相信解决方案,
,engine='python'
, error_bad_lines = False
Run Code Online (Sandbox Code Playgroud)
如果它是虚拟列并且您想删除它,那就太好了。就我而言,第二行确实有更多列,我希望将这些列整合起来并让列数 = MAX(列)。
请参考下面的解决方案,我无法在任何地方阅读:
try:
df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep)
except pd.errors.ParserError as err:
str_find = 'saw '
int_position = int(str(err).find(str_find)) + len(str_find)
str_nbCol = str(err)[int_position:]
l_col = range(int(str_nbCol))
df_data = pd.read_csv(PATH, header = bl_header, sep = str_sep, names = l_col)
Run Code Online (Sandbox Code Playgroud)
尽管此问题的情况并非如此,但压缩数据也可能会出现此错误。明确设置值来kwarg
compression
解决我的问题。
result = pandas.read_csv(data_source, compression='gzip')
Run Code Online (Sandbox Code Playgroud)
尝试读取带有空格,逗号和引号的制表符分隔表时,我遇到了类似的问题:
1115794 4218 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", ""
1144102 3180 "k__Bacteria", "p__Firmicutes", "c__Bacilli", "o__Bacillales", "f__Bacillaceae", "g__Bacillus", ""
368444 2328 "k__Bacteria", "p__Bacteroidetes", "c__Bacteroidia", "o__Bacteroidales", "f__Bacteroidaceae", "g__Bacteroides", ""
import pandas as pd
# Same error for read_table
counts = pd.read_csv(path_counts, sep='\t', index_col=2, header=None, engine = 'c')
pandas.io.common.CParserError: Error tokenizing data. C error: out of memory
Run Code Online (Sandbox Code Playgroud)
这说明它与C解析引擎(默认引擎)有关。也许更改为python会改变一切
counts = pd.read_table(path_counts, sep='\t', index_col=2, header=None, engine='python')
Segmentation fault (core dumped)
Run Code Online (Sandbox Code Playgroud)
现在,这是一个不同的错误。
如果我们继续尝试从表中删除空格,则python-engine的错误再次更改:
1115794 4218 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae",""
1144102 3180 "k__Bacteria","p__Firmicutes","c__Bacilli","o__Bacillales","f__Bacillaceae","g__Bacillus",""
368444 2328 "k__Bacteria","p__Bacteroidetes","c__Bacteroidia","o__Bacteroidales","f__Bacteroidaceae","g__Bacteroides",""
_csv.Error: ' ' expected after '"'
Run Code Online (Sandbox Code Playgroud)
很明显,熊猫在解析我们的行时遇到问题。要使用python引擎解析表,我需要事先删除表中的所有空格和引号。同时,C引擎即使连续出现逗号也不断崩溃。
为了避免创建带有替换的新文件,我这样做是因为表很小:
from io import StringIO
with open(path_counts) as f:
input = StringIO(f.read().replace('", ""', '').replace('"', '').replace(', ', ',').replace('\0',''))
counts = pd.read_table(input, sep='\t', index_col=2, header=None, engine='python')
Run Code Online (Sandbox Code Playgroud)
tl; dr
更改解析引擎,请尝试避免数据中出现任何非限定性的引号/逗号/空格。
就我而言,分隔符不是默认的“,”,而是制表符。
pd.read_csv(file_name.csv, sep='\\t',lineterminator='\\r', engine='python', header='infer')
Run Code Online (Sandbox Code Playgroud)
注意:“\t”并不像某些来源所建议的那样工作。“\\t”是必需的。
归档时间: |
|
查看次数: |
468860 次 |
最近记录: |