You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas从URL读取足球数据CSV时遇解析错误及问题求助

解决football-data CSV解析与合并的问题

我来帮你拆解一下问题出在哪,以及怎么修复:

第一个错误的根源

你遇到的ParserError: Expected 57 fields in line 305, saw 72,本质是football-data提供的部分CSV文件里,存在被引号包裹的字段(比如球员名字、赛事备注),而这些字段里包含了逗号。Pandas默认的CSV解析器会把这些内部逗号当成列分隔符,导致列数不匹配。你一开始尝试换分隔符没用,因为问题根本不是分隔符不对,而是字段内的特殊字符没被正确识别。

第二个代码的问题

你改用requests获取文本后,错误地用了sep='delimiter'——这个参数是用来指定单一分隔符的,而你写的'delimiter'并不是实际的分隔符(实际是逗号),所以Pandas把整行内容当成了一个列,导致DataFrame形状是(380,1)。之后你尝试取url_data[0],但此时DataFrame的列名可能不是0(比如第一行是表头,列名是CSV的原始表头),所以触发KeyError: 0。

正确的解决方案

其实不用手动拆分文本,直接给pd.read_csv加几个参数就能解决解析问题,同时处理合并时的列一致性问题:

import os
import pandas as pd
import csv  # 用来处理引号规则

GAMES = ['E0', 'E1', 'E2', 'E3']

def download_statistics():
    for year in range(2003, 2020):
        year_format = str(year)[-2:] + str(year+1)[-2:]
        for game in GAMES:
            file_name = f'{game}.csv'
            # 读取现有数据(如果存在)
            previous_data = pd.read_csv(file_name) if os.path.isfile(file_name) else None
            
            # 关键:用csv.QUOTE_ALL识别引号包裹的字段,同时跳过解析错误的行
            url_data = pd.read_csv(
                f'http://football-data.co.uk/mmz4281/{year_format}/{game}.csv',
                quoting=csv.QUOTE_ALL,  # 告诉Pandas识别所有被引号包裹的字段
                on_bad_lines='skip',    # 跳过解析错误的行(避免崩溃)
                low_memory=False        # 关闭低内存模式,避免类型推断警告
            )
            
            if previous_data is not None:
                # 确保列名一致,只保留两者共有的列
                common_cols = list(set(previous_data.columns) & set(url_data.columns))
                combined_data = pd.concat([
                    previous_data[common_cols],
                    url_data[common_cols]
                ])
                # 去重(避免重复下载同一行)
                combined_data = combined_data.drop_duplicates()
                combined_data.to_csv(file_name, index=False)
            else:
                url_data.to_csv(file_name, index=False)

if __name__ == '__main__':
    download_statistics()

关键改进点:

  • quoting=csv.QUOTE_ALL:让Pandas正确识别被引号包裹的字段,不会把字段内的逗号当成列分隔符。
  • on_bad_lines='skip':跳过极少数确实有格式问题的行(新版本Pandas替代旧的error_bad_lines=False)。
  • 列名一致性处理:不同年份的CSV可能新增/减少了列,取两者共有的列再合并,避免出现大量NaN或列混乱。
  • drop_duplicates():避免重复下载同一赛季的数据时,出现重复行。

额外提示

如果还是遇到个别行解析问题,可以尝试指定engine='python'(Pandas默认用C引擎,Python引擎对复杂格式兼容性更好,但速度稍慢):

url_data = pd.read_csv(
    f'http://football-data.co.uk/mmz4281/{year_format}/{game}.csv',
    quoting=csv.QUOTE_ALL,
    on_bad_lines='skip',
    engine='python'
)

内容的提问来源于stack exchange,提问作者nobie_programmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:33:15