Python os.walk遍历多文件夹处理文件代码无运行效果问题
代码存在的核心问题
- 完全误解了
os.walk()的返回逻辑:os.walk()每轮迭代对应一个正在访问的文件夹,三个返回值分别是:当前文件夹路径root、当前文件夹下的子文件夹名列表dirs、当前文件夹下的文件名列表files。原代码的嵌套循环完全没对应上这三个值的含义。 - 循环对象错误:原代码里
for i in dirs拿到的i是单个子文件夹的名字字符串(比如子文件夹叫sample1,i就是字符串"sample1"),后续for file in i实际是在遍历这个字符串的每个字符,根本不是在遍历文件;后续os.path.join(i, files)传入的files是当前层级的整个文件列表,不是单个文件名,根本拼不出合法的文件路径。 - 无输出的原因:如果你的
Training Sets根目录下第一层全是子文件夹、没有直接存放的文件,原代码的逻辑根本不会触发任何合法的文件读取操作,哪怕加了打印语句,如果放在错误的嵌套层级,也不会有任何输出。
修正方案
os.walk()本身就是按顺序遍历文件夹的,处理完当前文件夹下的所有文件后,会自动进入下一个子文件夹迭代,完全匹配你「处理完前一个文件夹全部文件再进入下一个」的需求,修正后代码如下:
import os import pandas as pd for root, dirs, files in os.walk("Training Sets"): print(f"当前处理文件夹:{root}") # 遍历当前文件夹下的所有文件 for file_name in files: # 拼接文件完整路径 file_path = os.path.join(root, file_name) # 可选:过滤非目标格式文件,避免读取报错 if not file_name.endswith(('.tsv', '.csv', '.txt')): continue print(f"当前处理文件:{file_path}") dataset = pd.read_csv(file_path, sep='\t', header=None) trainSet = dataset.values.tolist() editedSet = dataset.values.tolist() # 后续你的业务处理逻辑直接写在这里即可
如果你不需要递归遍历多层子文件夹,只需要处理
Training Sets下第一层子文件夹内的文件,可以不用os.walk(),直接按如下逻辑写即可:
import os import pandas as pd root_path = "Training Sets" # 遍历根目录下所有一级条目 for entry in os.listdir(root_path): folder_path = os.path.join(root_path, entry) # 跳过非文件夹的条目 if not os.path.isdir(folder_path): continue print(f"当前处理文件夹:{folder_path}") # 遍历当前子文件夹下的所有文件 for file_name in os.listdir(folder_path): file_path = os.path.join(folder_path, file_name) # 跳过子文件夹,只处理文件 if not os.path.isfile(file_path): continue if not file_name.endswith(('.tsv', '.csv', '.txt')): continue print(f"当前处理文件:{file_path}") dataset = pd.read_csv(file_path, sep='\t', header=None) trainSet = dataset.values.tolist() editedSet = dataset.values.tolist() # 后续业务逻辑
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

