CSV数据行(取值)的列数多于表头字段数-Pandas无法正常读取

news/2024/10/18 9:18:46/

CSV数据行(取值)的列数多于表头字段数-Pandas无法正常读取

问题描述:在使用Pandas正常读取csv文件时,报错提示“ ParserError: Error tokenizing data. C error: Expected 460 fields in line 3363, saw 472”。也就是数据行的值个数多于表头字段个数。处理过程记录如下,完整代码和测试数据可以从Github仓库Useful-Python-Scripts获取,也可以在jupyter nbviewer中在线浏览。

# 读取一个测试数据.   数据可以在Datasets文件夹获取.
import pandas as pddf = pd.read_csv('../Datasets/CSV数据行的列数大于表头字段个数/2024_06_05_21.csv', index_col=0)df.shape
---------------------------------------------------------------------------ParserError                               Traceback (most recent call last)<ipython-input-2-6be17fa04a2a> in <module>2 import pandas as pd3 
----> 4 df = pd.read_csv('../Datasets/CSV数据行的列数大于表头字段个数/2024_06_05_21.csv', index_col=0)5 6 df.shaped:\installation\Anaconda3\lib\site-packages\pandas\util\_decorators.py in wrapper(*args, **kwargs)309                     stacklevel=stacklevel,310                 )
--> 311             return func(*args, **kwargs)312 313         return wrapperd:\installation\Anaconda3\lib\site-packages\pandas\io\parsers\readers.py in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)584     kwds.update(kwds_defaults)585 
--> 586     return _read(filepath_or_buffer, kwds)587 588 d:\installation\Anaconda3\lib\site-packages\pandas\io\parsers\readers.py in _read(filepath_or_buffer, kwds)486 487     with parser:
--> 488         return parser.read(nrows)489 490 d:\installation\Anaconda3\lib\site-packages\pandas\io\parsers\readers.py in read(self, nrows)1045     def read(self, nrows=None):1046         nrows = validate_integer("nrows", nrows)
-> 1047         index, columns, col_dict = self._engine.read(nrows)1048 1049         if index is None:d:\installation\Anaconda3\lib\site-packages\pandas\io\parsers\c_parser_wrapper.py in read(self, nrows)222         try:223             if self.low_memory:
--> 224                 chunks = self._reader.read_low_memory(nrows)225                 # destructive to chunks226                 data = _concatenate_chunks(chunks)d:\installation\Anaconda3\lib\site-packages\pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.read_low_memory()d:\installation\Anaconda3\lib\site-packages\pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._read_rows()d:\installation\Anaconda3\lib\site-packages\pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._tokenize_rows()d:\installation\Anaconda3\lib\site-packages\pandas\_libs\parsers.pyx in pandas._libs.parsers.raise_parser_error()ParserError: Error tokenizing data. C error: Expected 460 fields in line 3363, saw 472
"""
报错表明在处理CSV文件时,第3363行的字段数量与预期的不符。预期应该有460个字段,但实际看到了472个值.
正常情况下,pandas无法按照标准的二维表进行读取.
"""
"""
一种解决方案是:可以使用Python内置的csv模块, CSV对象工具包逐行读取CSV文件.
"""
# 这是一个示例脚本.
import csv# 指定要读取的CSV文件路径
csv_file_path = '../Datasets/CSV数据行的列数大于表头字段个数/2024_06_05_21.csv'# 逐行读取CSV文件
with open(csv_file_path, mode='r', encoding='utf-8') as csvfile:csv_reader = csv.reader(csvfile)for line_number, row in enumerate(csv_reader, start=1):try:# 处理每一行数据print(f"行号 {line_number} 的数据: {row}")# 这里可以根据需要进行数据处理except Exception as e:print(f"第 {line_number} 行处理出错: {e}")
一种解决方案
import csv# 指定输入和输出文件路径.
input_csv_file = '../Datasets/CSV数据行的列数大于表头字段个数/2024_06_05_21.csv'
output_csv_file = '../Datasets/CSV数据行的列数大于表头字段个数/modified_file.csv'# 初始化最大列数.
max_columns = 0
rows = []# 逐行读取CSV文件.
with open(input_csv_file, mode='r', encoding='utf-8') as csvfile:csv_reader = csv.reader(csvfile)# 获取表头.header = next(csv_reader)rows.append(header)# 遍历每一行.for row in csv_reader:rows.append(row)# 更新最大列数.max_columns = max(max_columns, len(row))  # 统计数据行的最大列数.# 生成新的表头.
modified_header = header[:]  # 先复制一份原始表头.
while len(modified_header) < max_columns:  # 添加“Missing”直到最大列数.modified_header.append("Missing")# 写入新的CSV文件.
with open(output_csv_file, mode='w', newline='', encoding='utf-8') as csvfile:csv_writer = csv.writer(csvfile)# 写入修改后的表头.csv_writer.writerow(modified_header)# 写入未修改的数据行(原样写入).for row in rows[1:]:  # 跳过原始表头.csv_writer.writerow(row)print("文件处理完成,已输出到", output_csv_file)
文件处理完成,已输出到 ../Datasets/CSV数据行的列数大于表头字段个数/modified_file.csv
# 再次读取测试,正常读取.
import pandas as pddf = pd.read_csv('../Datasets/CSV数据行的列数大于表头字段个数/modified_file.csv', index_col=0)
df.shape
(6428, 471)

http://www.ppmy.cn/news/1532658.html

相关文章

Linux指令收集

文件和目录操作 ls: 列出目录内容。 -l 显示详细信息。-a 显示隐藏文件&#xff08;以.开头的文件&#xff09;。cd: 改变当前工作目录。 cd ~ 返回主目录。cd .. 上移一级目录。pwd: 显示当前工作目录。mkdir: 创建目录。 mkdir -p path/to/directory 创建多级目录。rmdir: 删…

【递归】6.LPC 44 开幕式火焰

1 题目描述 题目链接&#xff1a;开幕式火焰 2 解答思路 递归分为三步&#xff0c;接下来就按照这三步来思考问题 第一步&#xff1a;挖掘出相同的子问题 &#xff08;关系到具体函数头的设计&#xff09; 第二步&#xff1a;只关心具体子问题做了什么 &#xff08;关系…

Python3 爬虫教程 - Web 网页基础

Web网页基础 1&#xff0c;网页的组成HTMLcssJavaScript2&#xff0c;网页的结构 3&#xff0c;节点树及节点间的关系4&#xff0c;选择器开头代表选择 id&#xff0c;其后紧跟 id 的名称。如&#xff1a;div 节点的 id 为 container&#xff0c;那么就可以表示为 #container 1…

监控告警功能详细介绍及操作演示:运维团队的智能保障

在当今这个信息化高速发展的时代&#xff0c;运维团队面临着前所未有的挑战。为了确保系统的稳定性和高效运维&#xff0c;监控告警功能成为了运维团队不可或缺的得力助手。本文将详细介绍我们的监控告警功能&#xff0c;并结合实际操作页面进行演示&#xff0c;帮助运维团队更…

目前最好用的爬虫软件是那个?

作为一名数据工程师&#xff0c;三天两头要采集数据&#xff0c;用过十几种爬虫软件&#xff0c;也用过Python爬虫库&#xff0c;还是建议新手使用现成的软件比较方便。 这里推荐3款不错的自动化爬虫工具&#xff0c;八爪鱼、亮数据、Web Scraper 1. 八爪鱼爬虫 八爪鱼爬虫是一…

DMDSC更换DCR和VOTE磁盘

DMDSC更换DCR和VOTE磁盘 为了提高DMDSC集群运行速度和节点之间通信协调的效率&#xff0c;需要将运行在机械盘上的dcr和vote磁盘替换到SSD高效磁盘上。将原来200M的dcr和vote机械磁盘&#xff0c;换成500M的SSD高效磁盘。 磁盘替换规划信息如下所示&#xff1a; 信息说明 替…

深度学习模型之BERT的24个小模型源码与预训练紧凑模型的重要性

原始信息 论文&#xff1a; Well-Read Students Learn Better: On the Importance of Pre-training Compact Models作者&#xff1a;Iulia Turc, Ming-Wei Chang, Kenton Lee, Kristina Toutanova地址&#xff1a;arxiv.org/pdf/1908.08…中文&#xff1a;阅读良好的学生学得更…

OJ在线评测系统 前端 完善题目提交服务 细讲异步前端请求与后端接口交互

题目提交服务完善 这则笔记是我们来梳理一下前后端逻辑 主要是我们的提交逻辑 先是看前端 按钮绑定的是这个异步请求 async 关键字表示这个函数内部会使用 await 来等待异步操作完成。 异步提交表单数据 const doSubmit async () > {// message.error("刷题机架构…