繁体   English   中英

在Pandas read_csv期间标记数据时出错。 如何真正看到坏线?

[英]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])

我在加载过程中遇到了几个错误。

  1. 首先,如果我没有指定warn_bad_lines=True,error_bad_lines=False我得到:

    标记数据时出错。 C错误:预计在329867行的22个字段中,看到24个

  2. 其次,如果我使用上面的选项,我现在得到:

    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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM