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

Python写入CSV格式异常:动漫数据分类与简介字段解析错误

解决动漫数据写入CSV时分类与简介混叠的问题

问题根源

你的核心问题出在手动拼接字符串后用逗号分割的操作上:

  • 当genres包含多个分类时(例如"Adventure, Fantasy, Shounen"),用, 连接后再通过re.split(r"[,]", details)分割,会把每个分类拆成单独的列表元素。
  • 后续parsed_data_to_dict函数仅取data[9]作为genres值,剩下的分类元素会被合并到synopsis字段,导致格式混乱。

修正方案

1. 重构解析函数:直接构建字段列表

放弃手动拼接字符串再分割的方式,直接生成包含所有字段的列表,确保带逗号的genres作为完整元素存在:

import re

def parse_data(data):
    try: 
        # 解析分类
        genres_list = data['genres']
        genres = ', '.join(genre['name'] for genre in genres_list)
        
        # 解析工作室:优化逻辑,避免字符串转义与正则匹配
        studio_name = "unknown"
        studios = data.get('studios', [])
        if studios:
            studio_name = studios[0]['name']
        
        # 解析简介
        synopsis_dirty = data['synopsis']
        synopsis = re.sub(r"\(Source: [^\)]+\)", "", synopsis_dirty).strip()
        synopsis = re.sub(r'\[Written by MAL Rewrite\]', '', synopsis).strip()
        synopsis = synopsis.encode('utf-8').decode('cp1252', 'replace')
        
        # 直接构建字段列表,每个字段为独立元素
        return [
            str(data['id']),
            data['title'].encode('utf-8').decode('cp1252', 'replace'),
            data['start_date'],
            str(data['mean']),
            str(data['rank']),
            str(data['popularity']),
            str(data['num_episodes']),
            data['rating'],
            studio_name,
            genres,
            synopsis
        ]
    except Exception as e:
        print(f"解析失败: {e}")
        return None

2. 简化字典转换函数

由于parse_data返回的列表元素顺序固定,直接按索引取值即可:

def parsed_data_to_dict(data):
    try:
        return {
            "id": data[0],
            "title": data[1],
            "start-date": data[2],
            "mean": data[3],
            "rank": data[4],
            "popularity": data[5],
            "num_episodes": data[6],
            "rating": data[7],
            "studio": data[8],
            "genres": data[9],
            "synopsis": data[10]
        }
    except IndexError as e:
        print(f"字典转换失败: {e}")
        return None

3. 用内置CSV模块写入文件(推荐)

手动处理CSV格式容易出错,Python内置的csv模块会自动处理字段中的逗号、引号等特殊字符:

import csv

# 假设api_data是从接口获取的原始数据列表
anime_records = []
for item in api_data:
    parsed = parse_data(item)
    if parsed:
        anime_records.append(parsed_data_to_dict(parsed))

# 写入CSV文件
with open('anime_data.csv', 'w', newline='', encoding='utf-8') as f:
    field_names = ["id", "title", "start-date", "mean", "rank", "popularity", "num_episodes", "rating", "studio", "genres", "synopsis"]
    writer = csv.DictWriter(f, fieldnames=field_names, quoting=csv.QUOTE_ALL)
    
    writer.writeheader()
    for record in anime_records:
        writer.writerow(record)

生成的CSV会自动为包含逗号的字段(如分类)添加引号,完全符合你预期的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 03:42:10