读取文件夹CSV文件到DataFrame时如何跳过子文件夹?
嘿,我来帮你搞定这个问题!你遇到的报错大概率是因为glob.glob虽然只会匹配当前目录下的.csv后缀条目,但如果刚好有个子文件夹的名字也带.csv后缀(虽然这种情况很少见),就会把它当成文件去读,自然就报错了。或者也可能是你后续代码里不小心触发了递归处理?不管怎样,给你几个靠谱的修改方案:
方案1:在现有循环里过滤目录(最小改动)
直接在你的循环逻辑里加一层判断,只处理真正的文件,跳过所有目录:
import pandas as pd import glob import numpy as np import os import datetime import time path = r'/Users/user/desktop/Sales/' allFiles = glob.glob(path + "/*.csv") frame = pd.DataFrame() list_ = [] for file_ in allFiles: # 先确认当前路径是文件而非目录,不是就跳过 if os.path.isfile(file_): df = pd.read_csv(file_, index_col=None, header=0) list_.append(df) frame = pd.concat(list_)
方案2:用os.listdir精准筛选(更可控)
这种方式可以直接过滤出符合条件的文件,从源头上避免误抓目录:
import pandas as pd import numpy as np import os import datetime import time path = r'/Users/user/desktop/Sales/' list_ = [] for filename in os.listdir(path): # 只保留后缀为.csv的文件,同时排除目录 if filename.lower().endswith('.csv') and os.path.isfile(os.path.join(path, filename)): file_path = os.path.join(path, filename) df = pd.read_csv(file_path, index_col=None, header=0) list_.append(df) frame = pd.concat(list_)
这里加了lower()是为了兼容大小写不同的后缀(比如.CSV),如果不需要可以去掉。
方案3:用pathlib(Python3.4+推荐的现代写法)
pathlib的API更直观,处理文件路径更不容易出错,也能轻松跳过子目录:
import pandas as pd import numpy as np import datetime import time from pathlib import Path path = Path(r'/Users/user/desktop/Sales/') list_ = [] # 只遍历当前目录下的.csv文件,自动忽略子目录 for csv_file in path.glob('*.csv'): if csv_file.is_file(): df = pd.read_csv(csv_file, index_col=None, header=0) list_.append(df) frame = pd.concat(list_)
补充说明:其实默认情况下glob.glob(path + "/*.csv")是不会递归子目录的,它只会扫描当前目录下的条目。所以报错的核心原因应该是有不符合的条目(比如名字带.csv的目录)被当成文件读取了,上面的方案都通过判断文件属性来跳过目录,完美解决这个问题。
内容的提问来源于stack exchange,提问作者Taukheer
相关产品推荐
相关产品推荐

