Python爬虫导出CSV格式异常求助:所有数据集中在一行
解决CSV数据全在一行的问题
你的问题核心是数据组织逻辑错误:你把所有赛季、所有位置集合、所有球队分别存成三个大列表,最后把这三个大列表作为一行塞进DataFrame,自然导出的CSV只有一行。正确的做法是把每个赛季下的「单支球队+对应位置」做成一条独立记录,再统一存入DataFrame。
修正后的代码
import re import os import pandas as pd # 初始化存储单条记录的列表 Base = [] for ele in os.listdir('Data/Saison'): with open(f'Data/Saison/{ele}', 'r', encoding='utf8') as output: contenu = output.read() saison = ele.replace('.html', '') # 提取当前赛季的所有位置 pattern_pos = '<td class="left first__left strong">(.{1,8})</td>' positions = re.findall(pattern_pos, contenu) # 提取当前赛季的所有球队名称 pattern_team = '<a class="list-team-entry" href="/fr/basketball/equipe/(.{1,30})" title="(.{1,20})">' teams = [e[1] for e in re.findall(pattern_team, contenu)] # 关键:将同一赛季的位置与球队一一配对,生成单条记录 for pos, team in zip(positions, teams): Base.append({ 'saison': saison, 'position': pos, 'equipe': team }) # 用字典列表直接生成DataFrame,每条字典对应CSV的一行 df = pd.DataFrame(Base) df.to_csv('DataFinal/Base.csv', sep='|', encoding='utf8', index=False)
关键改动说明
- 移除了全局的
Saison、Position、Equipe列表,改为在每个赛季循环内处理该赛季的局部数据,避免数据堆积成大列表。 - 使用
zip(positions, teams)把同一赛季的位置和球队一一绑定,每条绑定结果以字典形式存入Base,确保每条记录对应一组完整的赛季-位置-球队信息。 - 直接用字典列表生成DataFrame,天然匹配CSV「每行一条数据」的格式要求。
注意事项
- 必须保证
positions和teams的数量完全一致,否则zip会截断到较短的列表长度,导致部分数据丢失。如果数量不匹配,需要检查正则表达式是否正确提取了所有目标数据。
内容的提问来源于stack exchange,提问作者Nadia
相关产品推荐
相关产品推荐

