Python 3中如何处理含逗号的输入内容以正常导出CSV?
问题:含逗号的卡牌名称导致CSV导出异常
问题根源
CSV格式默认用逗号作为字段分隔符,当卡牌名称(如Azusa, Lost but Seeking)包含逗号时,pandas读取TXT文件并当作CSV解析时,会把逗号误判为字段分割符,认为一行有多个字段,因此跳过这些行,导致导出的CSV不完整。
解决方案
方案1:直接生成规范CSV(推荐,同时优化卡组存储)
先把卡组从「重复存卡牌名的列表」改成「卡牌名+数量的字典」,既节省内存,又能更灵活地导出文件,同时用Python内置csv模块自动处理含逗号的字段。
1. 优化卡牌添加函数
# 初始化卡组为字典,键是卡牌名,值是数量 deck = {} def card_adder(deck_dict): next_one = input("ADD: ").strip() # 确保输入的数量是整数 while True: try: copies = int(input("How many? ").strip()) break except ValueError: print("请输入有效的数字") # 更新卡组字典 if next_one in deck_dict: deck_dict[next_one] += copies else: deck_dict[next_one] = copies # 计算总卡牌数 total_cards = sum(deck_dict.values()) print(f"There are currently {total_cards} cards in the deck.")
2. 修改导出函数
import csv def exporter(deck_dict): deckname = input("Deck name: ").strip() # 导出TXT文件(保持原有格式,每行一个卡牌名) with open(f"{deckname}.txt", "w", encoding="utf-8") as txt_file: for card_name, count in deck_dict.items(): txt_file.write(f"{card_name}\n" * count) # 导出规范CSV文件(自动给含逗号的卡牌名加引号) with open(f"{deckname}.csv", "w", newline="", encoding="utf-8") as csv_file: # 设置quoting=csv.QUOTE_NONNUMERIC,自动给非数值字段加引号 writer = csv.writer(csv_file, quoting=csv.QUOTE_NONNUMERIC) # 可选:添加表头 writer.writerow(["Card Name"]) # 按数量重复写入卡牌名 for card_name, count in deck_dict.items(): for _ in range(count): writer.writerow([card_name]) # 可选:导出「卡牌名+数量」的紧凑CSV(更适合统计) # with open(f"{deckname}_summary.csv", "w", newline="", encoding="utf-8") as summary_csv: # writer = csv.writer(summary_csv, quoting=csv.QUOTE_NONNUMERIC) # writer.writerow(["Card Name", "Copies"]) # for card_name, count in deck_dict.items(): # writer.writerow([card_name, count])
方案2:保留原有列表存储,修改pandas读取逻辑
如果不想改动卡组的存储方式,只需修改exporter中pandas读取TXT的参数,告诉它正确识别带逗号的字段:
import pandas as pd def exporter(seventyfive): deckname = input("Deck name: ") # 写入TXT文件逻辑不变 with open(f"{deckname}.txt", "w", encoding="utf-8") as deck: for card in seventyfive: deck.write(card+"\n") # 修改pandas读取规则:识别带引号的字段,禁用逗号分割 read_file = pd.read_csv( f"{deckname}.txt", header=None, # 无表头 names=["Card Name"], # 给列命名 quoting=pd.io.common.csv.QUOTE_ALL, # 识别被引号包裹的字段 quotechar='"', # 指定引号字符 sep="\n" # 按行分割,而不是逗号 ) # 导出CSV时给非数值字段加引号 read_file.to_csv( f"{deckname}.csv", index=None, quoting=pd.io.common.csv.QUOTE_NONNUMERIC )
效果验证
当输入含逗号的卡牌名(如Azusa, Lost but Seeking)时,导出的CSV会自动将该名称用双引号包裹("Azusa, Lost but Seeking"),pandas读取时不会再误判字段,所有卡牌都会被正确导出。
内容的提问来源于stack exchange,提问作者Brutishly7828
相关产品推荐
相关产品推荐

