Python多CSV文件处理求助:合并数据至DataFrame并导出Excel时仅首个数据写入的问题
批量处理CSV并汇总数据到Excel的解决方案
问题描述
我是Python初学者,现需编写代码完成以下任务:
- 读取文件夹内100至200个CSV文件;
- 提取每个CSV文件中位置(2,2)的变量作为SIM-Karte(ID);
- 计算每个CSV文件第17列所有值的总和作为Datenverbrauch;
- 将上述所有提取的数据整理为单个DataFrame;
- 将该DataFrame导出至新的Excel文件。
我尝试了代码,但运行后仅首个CSV文件的ID和总和被导入Excel,不清楚如何正确创建包含所有数据的单个DataFrame,恳请得到帮助。
原代码的问题分析
咱们先拆解下你代码里的核心问题:
- 未累加数据:每次循环都新建
df4,直接覆盖了之前文件的结果,相当于只保留了最后一次循环的数据(你说只看到首个可能是测试时的特殊情况,但核心逻辑是没收集所有数据)。 - ID提取错误:你用了
skiprows=2,这会跳过前两行,而你要的(2,2)位置(第二行第二列)正好在被跳过的范围内,根本读不到目标值;同时usecols=[2,16]也没包含(2,2)对应的列(1-based的第2列对应0-based索引1)。 - 未定义合并变量:代码里用了
concatenated.to_excel,但concatenated从来没被定义过,这会报错,你能运行起来可能是测试时的偶然情况。
修正后的代码
下面是调整后的完整代码,关键改进点我会在后面说明:
import pandas as pd import os import glob # 获取当前目录下所有CSV文件路径 path = os.getcwd() csv_files = glob.glob(os.path.join(path, "*.csv")) # 初始化空列表,用来存每个CSV的提取结果 results_list = [] # 遍历所有CSV文件 for csv_file in csv_files: # 1. 提取SIM-Karte(ID):对应原文件(2,2)位置(1-based,即0-based行1、列1) # 只读取前2行,不用加载整个大文件,节省内存 id_df = pd.read_csv(csv_file, sep=';', nrows=2, header=None) sim_id = id_df.iloc[1, 1] # 第二行第二列(0-based索引) # 2. 计算第17列(0-based索引16)的总和 # 只读取第17列,提升处理大量文件的效率 data_df = pd.read_csv(csv_file, sep=';', usecols=[16], header=None) datenverbrauch = data_df.iloc[:, 0].sum() # 把当前文件的结果加入列表 results_list.append({ 'SIM-Karte': sim_id, 'Datenverbrauch': datenverbrauch }) # 把列表转换成统一的DataFrame final_result = pd.DataFrame(results_list) # 导出到Excel,index=False避免导出多余的索引列 final_result.to_excel('Auswertung.xlsx', index=False) print(f"搞定!成功导出 {len(final_result)} 条记录到Excel文件~")
关键改进说明
- 数据收集逻辑:用
results_list列表逐个存储每个CSV的结果,最后一次性转成DataFrame,既避免了循环中重复创建DataFrame的开销,又能保证所有数据都被保留。 - 精准提取ID:通过
nrows=2只读取前两行,再用iloc[1,1]精准定位你要的(2,2)位置(如果你的(2,2)是0-based,也就是第三行第三列,改成iloc[2,2]就行),不用加载整个文件,处理大文件时速度更快。 - 高效计算总和:用
usecols=[16]只读取第17列,减少内存占用,尤其是处理100-200个文件时,这个优化很实用。 - 整洁导出:添加
index=False参数,避免把DataFrame的索引列导出到Excel,让最终的文件更干净。
内容的提问来源于stack exchange,提问作者Florian Pichler
相关产品推荐
相关产品推荐

