[英]Error tokenizing data during Pandas read_csv. How to actually see the bad lines?
我有一个大的csv,我加载如下
df=pd.read_csv('my_data.tsv',sep='\t',header=0, skiprows=[1,2,3])
我在加载过程中遇到了几个错误。
首先,如果我没有指定warn_bad_lines=True,error_bad_lines=False
我得到:
标记数据时出错。 C错误:预计在329867行的22个字段中,看到24个
其次,如果我使用上面的选项,我现在得到:
CParserError:标记数据时出错。 C错误:字符串中的EOF从第32357585行开始
问题是: 我怎样才能看看这些不好的线条来理解发生了什么? 是否有可能让read_csv
返回这些虚假行?
我尝试了以下提示( 当读取多个csv文件到HDF5时,Pandas ParserError EOF字符 ):
from pandas import parser
try:
df=pd.read_csv('mydata.tsv',sep='\t',header=0, skiprows=[1,2,3])
except (parser.CParserError) as detail:
print detail
但仍然得到
标记数据时出错。 C错误:预计在329867行的22个字段中,看到24个
我将分两部分给出答案:
第1部分: op询问如何输出这些坏行,为了回答这个问题,我们可以在一个简单的代码中使用python csv模块:
import csv
file = 'your_filename.csv' # use your filename
lines_set = set([100, 200]) # use your bad lines numbers here
with open(file) as f_obj:
for line_number, row in enumerate(csv.reader(f_obj)):
if line_number > max(lines_set):
break
elif line_number in lines_set: # put your bad lines numbers here
print(line_number, row)
我们也可以把它放在更一般的功能中:
import csv
def read_my_lines(file, lines_list, reader=csv.reader):
lines_set = set(lines_list)
with open(file) as f_obj:
for line_number, row in enumerate(csv.reader(f_obj)):
if line_number > max(lines_set):
break
elif line_number in lines_set:
print(line_number, row)
if __name__ == '__main__':
read_my_lines(file='your_filename.csv', lines_list=[100, 200])
第2部分:您得到错误的原因:
如果没有您使用的文件样本,很难诊断出这样的问题。 但你应该试试这个..
pd.read_csv(filename)
是解析文件没有错误? 如果是这样,我会解释原因。
从第一行推断出列数。
通过使用skiprows和header=0
您转义了前3行,我想这包含列名称或应包含正确列数的标题。
基本上你限制了解析器正在做的事情。
所以解析没有skiprows,或header=0
然后重新索引到你以后需要的。
注意 :
如果你不确定文件中使用的分隔符使用sep=None
,但它会更慢。
来自pandas.read_csv docs:
sep:str,default','要使用的分隔符。 如果sep为None,则C引擎无法自动检测分隔符,但Python解析引擎可以,这意味着后者将被使用并通过Python的内置嗅探器工具csv.Sniffer自动检测分隔符。 此外,长度超过1个字符且与'\\ s +'不同的分隔符将被解释为正则表达式,并且还将强制使用Python解析引擎。 请注意,正则表达式分隔符很容易忽略引用的数据。 正则表达式示例:'\\ r \\ t'
就我而言,添加分隔符有助于:
data = pd.read_csv('/Users/myfile.csv', encoding='cp1251', sep=';')
我们可以从错误和打印行中获取行号以查看它的外观
尝试:
import subprocess
import re
from pandas import parser
try:
filename='mydata.tsv'
df=pd.read_csv(filename,sep='\t',header=0, skiprows=[1,2,3])
except (parser.CParserError) as detail:
print detail
err=re.findall(r'\b\d+\b', detail) #will give all the numbers ['22', '329867', '24'] line number is at index 1
line=subprocess.check_output("sed -n %s %s" %(str(err[1])+'p',filename),stderr=subprocess.STDOUT,shell=True) # shell command 'sed -n 2p filename' for printing line 2 of filename
print 'Bad line'
print line # to see line
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.