使用Glob匹配指定后缀文件名遇阻,求Python代码优化帮助
解决Excel文件动态匹配与合并优化问题
首先,咱们先搞定你遇到的AttributeError问题:
这个错误是因为你对glob的导入和调用方式不匹配导致的。如果用import glob,调用时要写glob.glob('匹配模式');如果是from glob import glob,直接写glob('匹配模式')就行,不能混合用glob.glob()——不然Python会把导入的glob函数当成对象,去找它的glob属性,自然就会报错。
接下来,针对你要自动匹配同一文件夹中后缀相同的文件的需求,咱们调整匹配逻辑:
从你原来的文件名(比如file-JAN_2019.xlsx)来看,你需要匹配所有以-JAN_2019.xlsx结尾的文件,对应的glob模式应该是"*-JAN_2019.xlsx"——星号*会匹配任意前缀内容,这样就能自动捞取所有符合这个后缀规则的文件。
最后,咱们把整个代码优化得更简洁高效,同时保留你原来的数据清洗逻辑:
import pandas as pd import glob # 动态匹配所有以"-JAN_2019.xlsx"结尾的Excel文件 excel_paths = glob.glob("*-JAN_2019.xlsx") # 批量读取并处理文件:保留你原代码中第一个文件不跳过行,其余文件跳过前21行的逻辑 frames = [] for idx, path in enumerate(excel_paths): df = pd.ExcelFile(path).parse(path.sheet_names[0], header=None, index_col=None) if idx == 0: frames.append(df) else: frames.append(df.iloc[21:, :]) # 合并数据并执行清洗 combined = pd.concat(frames) # 移除第4列为'-'或空值的行 combined = combined[~combined[4].isin(['-'])] combined.dropna(subset=[4], inplace=True) # 导出最终结果 combined.to_excel("c.xlsx", header=False, index=False)
如果所有文件都需要跳过前21行,可以把读取部分的代码简化成:
frames = [ pd.ExcelFile(path).parse(path.sheet_names[0], header=None, index_col=None).iloc[21:, :] for path in excel_paths ]
另外,你之前写的files.extend(names)是错误的——names是单个文件名字符串,extend会把字符串拆成单个字符添加到列表里,这也是你打印files会得到零散字符的原因,正确的写法是用files.append(names),不过上面的优化代码已经用更简洁的方式处理了这部分逻辑。
内容的提问来源于stack exchange,提问作者P.Costa
相关产品推荐
相关产品推荐

