Pandas: 可变字段数的read_csv“ CParserError:错误标记数据”

创建于 2015-10-31  ·  17评论  ·  资料来源: pandas-dev/pandas

尝试读取380+ MB的CSV文件时遇到read_csv (Pandas 0.17.0)问题。 该文件以54个字段开头,但是某些行包含53个字段而不是54个字段。运行以下代码会给我以下错误:

parser = lambda x: datetime.strptime(x, '%y %m %d %H %M %S %f')
df = pd.read_csv(filename,
                         names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                                'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                                'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                                'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                                'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                                'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                        usecols=range(0, 42),
                        parse_dates={"TIMESTAMP": [0, 1, 2, 3, 4, 5, 6]},
                        date_parser=parser,
                        header=None)

错误:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

如果我通过error_bad_lines=False关键字,则会显示有问题的行,类似于以下示例:

Skipping line 1683401: expected 53 fields, saw 54

但是这次我得到以下错误(也没有加载DataFrame):

CParserError: Too many columns specified: expected 54 and found 53

如果我通过engine='python'关键字,则不会出现任何错误,但是解析数据会花费很长时间。 请注意,根据是否使用error_bad_lines=False切换错误消息中的53和54。

IO CSV Usage Question

最有用的评论

尝试这个:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

所有17条评论

这些错误都是正确的。 您通过传递usecolsnames来约束解析器的工作。 不要这样做,看看是否可以解析它。

如果没有可复制文件的样本,很难诊断出这种情况。

同时显示pd.show_versions()

带有原始数据文件:

没有其他关键字的pd.read_csv(filename)似乎可以毫无错误地解析数据。 pd.read_csv(filename, header=None)给出以下错误:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

完全同意,没有样本数据很难诊断。 我试着用几行的csv文件生成错误(有些包含53个字段,有些包含54个字段), pd.read_csv填补了NaN的空白。 我重复通过传递usecolsheader=None仍然有效。 原始文件似乎存在引发所有错误的问题。

pd.show_versions()输出如下:

INSTALLED VERSIONS
------------------
commit: None
python: 2.7.10.final.0
python-bits: 64
OS: Windows
OS-release: 7
machine: AMD64
processor: Intel64 Family 6 Model 58 Stepping 9, GenuineIntel
byteorder: little
LC_ALL: None
LANG: None

pandas: 0.17.0
nose: 1.3.7
pip: 7.1.2
setuptools: 18.4
Cython: 0.22.1
numpy: 1.10.1
scipy: 0.16.0
statsmodels: 0.6.1
IPython: 3.2.0
sphinx: 1.3.1
patsy: 0.3.0
dateutil: 2.4.2
pytz: 2015.6
blosc: None
bottleneck: 1.0.0
tables: 3.2.0
numexpr: 2.4.3
matplotlib: 1.4.3
openpyxl: 1.8.5
xlrd: 0.9.3
xlwt: 1.0.0
xlsxwriter: 0.7.3
lxml: 3.4.4
bs4: 4.3.2
html5lib: None
httplib2: None
apiclient: None
sqlalchemy: 1.0.5
pymysql: None
psycopg2: None
pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

可以预期,因为从第一行推断出列数。 如果通过names if,它将用作确定特征。

因此,请继续尝试各种选择。 您实际上使用namesusecols 。 您最好阅读一下,然后根据需要重新索引。

奇怪的是,如果使用engine='python' ,它会加载DataFrame,而不会打h。 我使用以下代码段提取了文件中的前3行和有问题的3行(从错误消息中获取了行号)。

from csv import reader
N = int(input('What line do you need? > '))
with open(filename) as f:
    print(next((x for i, x in enumerate(reader(f)) if i == N), None))

第1-3行:

['08', '8', '7', '5', '0', '12', '54', '0', '11', '1', '58', '9', '68', '48.2', '0.756', '11.6', '17.5', '13.3', '4.3', '11.3', '32.2', '6.4', '4.1', '5.6', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '15', '80', '0', '11', '1', '62', '9', '69', '77.8', '3.267', '11.2', '17.7', '14.8', '4.2', '15.2', '29.1', '18.4', '10.0', '18.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['08', '8', '7', '5', '0', '21', '52', '0', '11', '1', '61', '11', '51', '29.4', '0.076', '4.1', '13.8', '8.3', '21.5', '5.3', '3.1', '5.7', '3.0', '6.1', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

违规行:

['09', '9', '15', '22', '46', '9', '51', '0', '11', '1', '57', '9', '70', '36.3', '0.242', '11.8', '16.2', '6.4', '4.1', '5.8', '31.3', '5.5', '3.9', '6.8', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '25', '31', '0', '11', '1', '70', '9', '73', '67.8', '2.196', '10.4', '17.0', '13.4', '4.4', '12.2', '31.8', '15.6', '4.2', '16.2', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']
['09', '9', '15', '22', '46', '28', '41', '0', '11', '1', '70', '5', '22', '7.4', '0.003', '4.0', '13.1', '3.4', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '0.0', '', '', '', '', '', '', '', '', '', '', '', '32']

如您所建议,我将尝试读取文件,然后修改DataFrame(重命名列,删除不必要的列等),或仅使用python引擎(处理时间长)。

根据进一步的调查,以下命令序列有效(我丢失了数据的第一行-没有header=None present-,但至少已加载):

df = pd.read_csv(filename, 
                 usecols=range(0, 42))
df.columns = ['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14']

以下操作无效

df = pd.read_csv(filename,
                 names=['YR', 'MO', 'DAY', 'HR', 'MIN', 'SEC', 'HUND',
                        'ERROR', 'RECTYPE', 'LANE', 'SPEED', 'CLASS',
                        'LENGTH', 'GVW', 'ESAL', 'W1', 'S1', 'W2', 'S2',
                        'W3', 'S3', 'W4', 'S4', 'W5', 'S5', 'W6', 'S6',
                        'W7', 'S7', 'W8', 'S8', 'W9', 'S9', 'W10', 'S10',
                        'W11', 'S11', 'W12', 'S12', 'W13', 'S13', 'W14'],
                 usecols=range(0, 42))

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

以下操作无效

df = pd.read_csv(filename,
                 header=None)

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

作为使用问题结束。

dic_df = _create_init_dic(“ C:/ Users / swati / Downloads / VQA-Med 2018数据集/c5e905f7-6eb0-4a98-b284-da0729a1caf3_VQAMed2018Train/VQAMed2018Train/VQAMed2018Train-QA.csv”)
ParserError:标记数据时出错。 C错误:第33行中应有1个字段,看到了3

尝试这个:

  df = pd.read_csv(filename,header=None,error_bad_lines=False)

尝试过,并为类似的错误工作,谢谢!

尝试在读取时添加quoting=3

有没有一种方法可以让熊猫忽略任何具有更多字段的行中的多余字段?
例如,在“预期行1605634中的53个字段,看见了54个”的情况下
它只是在行1605634中删除字段54

另一种情况! 但已通过“ error_bad_lines = False”解决,它仍会打印错误,但“退出代码0”

我有同样的错误

我只是在read_csv模式下添加了delimiter参数

而且有效

error_bad_lines =假
有用

pd.read_csv(filename, header=None) gives the following error:

CParserError: Error tokenizing data. C error: Expected 53 fields in line 1605634, saw 54

可以预期,因为从第一行推断出列数。 如果通过names if,它将用作确定特征。

因此,请继续尝试各种选择。 您实际上使用namesusecols 。 您最好阅读一下,然后根据需要重新索引。

这可行! 我使用R语言编写csv,并尝试在python中阅读。 第一行应具有所有行的最大长度。 这种方式将解决线路不良的问题,并且不会丢失任何线路。

如果尝试使用命令pd.read_csv导入.xlsx文件,则会出现此错误。

尝试使用pd.read_excel而不是pd.read_csv

修复它的最简单方法是将CSV文件转换为Excel文件,并使用pd.read_excel而不是pd.read_csv读取数据

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

jaradc picture jaradc  ·  3评论

Ashutosh-Srivastav picture Ashutosh-Srivastav  ·  3评论

idanivanov picture idanivanov  ·  3评论

nathanielatom picture nathanielatom  ·  3评论

andreas-thomik picture andreas-thomik  ·  3评论