当前位置: 当前位置:首页 > 百科 > python 提取数据 一个文件遍历多个文件正文

python 提取数据 一个文件遍历多个文件

作者:综合 来源:百科 浏览: 【大 中 小】 发布时间:2026-10-17 06:16:00 评论数:

拿到一个文件夹,数据里面有几百个CSV,个文个文每个文件结构一样,遍件但数据不同。历多老板让你把每个文件里的数据“销售额”列抽出来,汇总成一个总表。个文个文你手动复制粘贴?遍件那不如直接写段Python,三分钟搞定。历多

核心就一句话:用`glob`或`os.listdir`拿到所有文件路径,数据再循环读取,个文个文最后`concat`或`append`拼起来。遍件别想复杂了,历多Python做这事儿就像吃面条一样顺溜。数据

import pandas as pd import glob files = glob.glob('data/*.csv') df_list = [] for f in files: df = pd.read_csv(f,个文个文 usecols=['日期', '销售额']) df['来源文件'] = f.split('/')[-1] # 标记数据来自哪个文件 df_list.append(df) result = pd.concat(df_list, ignore_index=True) result.to_csv('汇总.csv', index=False) 

你看,五行业务代码,遍件搞定。但这里有个坑——如果某个文件格式不对,比如多了个空行或者列名不一致,整个循环会中断。我建议加个`try...except`,把出错的文件名打出来,跳过继续跑。别问我怎么知道的,上周我就栽在这上面,一个同事导出的Excel里混了个隐藏sheet,读出来全是NaN,差点把汇总数据搞废。

再说说内存问题。几百个小文件没问题,但如果你面对的是几千个几十MB的文件,一次性`concat`可能撑爆内存。这时候改用`pd.read_csv`的`chunksize`参数?不,更简单的是边读边写,用`to_csv`的`mode='a'`追加模式,或者先写表头,然后循环里只写数据行。

with open('汇总.csv', 'w') as out: out.write('日期,销售额,来源文件\n') # 手动写表头 for f in files: df = pd.read_csv(f, usecols=['日期', '销售额']) df['来源文件'] = f df.to_csv(out, header=False, index=False) 

这样内存占用恒定,跑再久也不慌。还有个细节——文件编码。Windows下导出的CSV经常是`gbk`,而Python默认`utf-8`,直接读会报错。要么在`read_csv`里指定`encoding='gbk'`,要么先探测一下。我习惯写个自动判断:先试`utf-8`,失败就换`gbk`,再失败就`latin1`,反正总能读出来。

最后说个我自己的习惯。遍历文件时,我总爱在文件名里提取日期或批次信息,比如`2024-05-01_销售.csv`,那就用正则`re.search(r'(\d{ 4}-\d{ 2}-\d{ 2})', f).group(1)`把日期抓出来当新列。这比单纯标记文件名有用得多,后续做时间序列分析直接按这个列分组就行。

代码不难,难的是想清楚你要什么。是先汇总再清洗,还是边读边清洗?数据量多大?有没有脏数据?这些问题想明白了,代码自然就写出来了。别一上来就抄模板,先打开一个文件,`df.head()`看看长什么样,再动手。磨刀不误砍柴工,Python这刀,磨快了砍什么都利索。