如何批量打开多个CSV文件?使用glob函数遇阻求解决方案
批量处理CSV文件计算条件均值的高效方案
嘿,完全懂你不想重复13次手动改文件名的烦躁!咱们把你的代码改成批量处理版本,用glob就能轻松搞定所有参与者的CSV文件,我帮你一步步调整:
先修正单个文件代码的小细节
你的原有代码里有几个可以优化的点:比如多余的list语句,还有Python3里已经不再推荐使用的has_key(),换成condname not in rts更规范。先把单个文件的逻辑理顺,再扩展成批量的。
批量处理的完整代码
下面是修改后的批量处理代码,既支持单个文件的条件均值计算,也可选汇总所有参与者的整体数据:
import csv import glob from statistics import mean # 第一步:用glob获取所有目标CSV文件的路径 # 请根据你的实际文件位置调整路径:比如'./participants/*.csv'(子文件夹)或者'*.csv'(当前目录) csv_file_paths = glob.glob('*.csv') # 可选:如果需要汇总所有参与者的所有数据,初始化一个全局字典 all_participant_data = {} # 遍历每个CSV文件 for file_path in csv_file_paths: print(f"正在处理文件:{file_path}") # 存储当前文件的条件-反应时列表 current_rts = {} # 用with语句打开文件,自动处理关闭操作,更安全 with open(file_path, 'r', newline='', encoding='utf-8') as csv_file: reader = csv.DictReader(csv_file) # 读取每一行数据 for row in reader: cond_name = row['cond'] reaction_time = float(row['reactiontime']) # 如果条件不在字典里,初始化空列表 if cond_name not in current_rts: current_rts[cond_name] = [] current_rts[cond_name].append(reaction_time) # 计算并输出当前文件的条件均值 print(f"文件 {file_path} 的条件均值:") for cond, times in current_rts.items(): avg_rt = mean(times) print(f" 条件 {cond}: {avg_rt:.2f}") # 可选:把当前文件的数据追加到全局汇总字典 if cond not in all_participant_data: all_participant_data[cond] = [] all_participant_data[cond].extend(times) # 可选:输出所有参与者的整体条件均值 print("\n所有参与者的整体条件均值:") for cond, all_times in all_participant_data.items(): overall_avg = mean(all_times) print(f" 条件 {cond}: {overall_avg:.2f}")
关键说明
glob的正确用法:如果你的CSV文件在单独的子文件夹里,比如叫participants,就把路径改成glob.glob('./participants/*.csv');如果是Windows系统的绝对路径,记得用原始字符串,比如glob.glob(r'C:\Experiments\participants\*.csv'),避免转义字符问题。- 文件安全处理:用
with open(...)代替直接open(),Python会自动帮你关闭文件,避免资源泄漏。 - 均值计算:用
statistics.mean()简化了均值计算,如果你不想导入额外模块,也可以自己写sum(times)/len(times)。 - 兼容性:代码适配Python3,替换了过时的
has_key()方法,用更Pythonic的in判断。
你之前用glob失败的可能原因
- 路径写错了:比如文件不在当前工作目录,却用了
*.csv,导致匹配不到任何文件。 - 文件后缀不匹配:比如有些文件是
.CSV大写后缀,glob默认区分大小写的话匹配不到,可以改成glob.glob('*.csv', recursive=True)或者手动处理大小写。
内容的提问来源于stack exchange,提问作者user9524759
相关产品推荐
相关产品推荐

