使用Python+pandas循环读取12个CSV文件出错,求原因分析
批量读取CSV文件的for循环异常问题分析与解决
你遇到的核心问题有两个:一是直接打印Jan2016触发NameError,二是循环结束后file只保留最后一个文件的数据。下面一步步拆解问题根源和解决办法:
问题根源
你的代码存在三个关键错误:
未定义的变量
i
你的循环变量是file,但读取文件路径时写的是+ i + ".csv"——i这个变量从未被声明过,如果没修正这个问题,代码第一步就会报错。你说执行print(file)能运行,应该是后来把i改成了file,但这个细节一定要注意。变量被重复覆盖
循环中你每次都把读取到的DataFrame赋值给file变量,这意味着每一次循环都会把前一次的结果覆盖掉。循环跑完后,file自然只保存最后一个文件(Dec2016)的数据。尝试访问不存在的变量
你从来没有创建过名为Jan2016的变量!循环里只是把所有文件的数据都存在file里,并没有给每个月份单独创建对应的变量,所以直接print(Jan2016)肯定会触发“变量未定义”的错误。
解决方案
根据你的需求,有两种常用的处理方式:
方式1:用字典存储每个文件的数据(保留单独的月份数据)
这种方式可以让你通过文件名(比如'Jan2016')随时访问对应月份的DataFrame,非常方便后续单独分析:
import pandas as pd files = ['Jan2016', 'Feb2016', 'Mar2016', 'Apr2016', 'May2016', 'Jun2016', 'Jul2016', 'Aug2016', 'Sep2016', 'Oct2016', 'Nov2016', 'Dec2016'] # 创建空字典存储每个月份的数据 monthly_data = {} for file_name in files: # 用f-string拼接路径更清晰,同时把数据存入字典 monthly_data[file_name] = pd.read_csv(f"/Volumes/Toshiba/PrescriptionData/Results2/{file_name}.csv") # 直接通过字典键访问对应月份的数据 print(monthly_data['Jan2016']) # 遍历所有月份的数据预览 for month, df in monthly_data.items(): print(f"\n===== {month} 数据预览 =====") print(df.head())
方式2:合并所有文件为一个大DataFrame(适合整体分析)
如果你的目标是把12个月的数据合并在一起做统一分析,可以用pd.concat:
import pandas as pd files = ['Jan2016', 'Feb2016', 'Mar2016', 'Apr2016', 'May2016', 'Jun2016', 'Jul2016', 'Aug2016', 'Sep2016', 'Oct2016', 'Nov2016', 'Dec2016'] # 创建空列表存储每个月份的DataFrame df_list = [] for file_name in files: df = pd.read_csv(f"/Volumes/Toshiba/PrescriptionData/Results2/{file_name}.csv") # 添加月份标记列,方便后续筛选分析 df['month'] = file_name df_list.append(df) # 合并所有DataFrame为一个大表 combined_df = pd.concat(df_list, ignore_index=True) # 查看合并后的数据 print(combined_df)
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

