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
相关产品推荐
相关产品推荐

