Python读取CSV追加列表元素时字符串被拆分为单个字符怎么办
问题成因
你遇到的字符串拆成单字符的问题核心原因有两个:
- 列表追加逻辑错误:Python中列表使用
+=操作符时,等价于调用extend()方法,会遍历传入的可迭代对象,将其中的每个元素逐个追加到列表。字符串本身是由单个字符组成的可迭代序列,因此Living_beings+=row['Category']会把分类字符串拆成一个个字符存入列表,而非把整个分类名作为单个元素存入。 - 日期匹配逻辑存在隐患:你当前写的
date.today().day in row['Date']是字符串子串匹配逻辑,不仅存在类型不匹配风险(整数和字符串做成员判断会报错),还会出现误匹配,比如当天是1号时,会误匹配到Date字段里含1的14、21这类值。另外你的CSV文件所有字段都被单引号包裹,默认读取时会把单引号作为字段内容的一部分,数据不干净。
修复方案
按以下三点调整代码即可得到预期输出:
- 替换列表追加方式:把
+=追加字符串改为用append()方法,将整个分类名作为单个元素存入列表。 - 修正CSV读取配置:给
DictReader指定quotechar="'"参数自动去除包裹字段的单引号,加skipinitialspace=True跳过每行字段前的多余空格。 - 修正日期判断逻辑:读取到Date字段后,先按逗号拆分为单个日期值,转为整数后再和当天的日期(整数)做成员判断,避免子串匹配的误判问题。
修复后的完整代码:
from csv import DictReader from datetime import date Living_beings = [] today_day = date.today().day with open(users_read, 'r') as f: # 配置读取规则,自动处理单引号包裹、字段前空格问题 reader = DictReader(f, quotechar="'", skipinitialspace=True) for row in reader: # 拆分日期字段为整数列表 date_nums = [int(num.strip()) for num in row['Date'].split(',')] if today_day in date_nums: # 追加整个分类名为单个列表元素 Living_beings.append(row['Category']) print(Living_beings)
如果运行代码当天为5号或21号,输出结果为:
['Sparrow', 'Penguin']
和预期结果完全一致。
补充说明:如果坚持要用
+=实现追加,需要把传入的字符串包装为列表,即写成Living_beings += [row['Category']],但这种写法可读性不如append(),不推荐使用。
内容的提问来源于stack exchange,提问作者Prasanna Balaji
相关产品推荐
相关产品推荐

