要直接切入主题,今儿个我就要引领着你,一步一步地将Python当中文件夹路径的循环遍历稳稳拿下,关键核心存在着两个堪称神器的东西:os.path.join()以及 f-string。
不少刚开始接触的新手,一旦遇到路径拼接的情况,就会感到头疼,反斜杠与正斜杠分辨不清,在进行字符串相加操作时,会出现各种各样的报错现象。
别慌,我带你把这块硬骨头啃下来。
先看一个最简可运行 demo,让你立刻有感觉:
# 运行环境:Python 3.8+,无需额外安装依赖
import os
# 当前目录下的 test 文件夹路径
folder_path = './test'
# 小白版:最基础的遍历+拼接
# 入参:folder_path 文件夹路径,出参:打印每个文件的完整路径
try:
# os.listdir()获取文件夹下所有文件名
for filename in os.listdir(folder_path):
# os.path.join()自动处理操作系统差异(Windows 用,Mac/Linux 用/)
full_path = os.path.join(folder_path, filename)
print(full_path)
except FileNotFoundError:
print(f'报错啦!找不到文件夹:{folder_path},检查下路径对不对')
运行效果:
./test/test_result_1.txt
./test/test_result_2.txt
./test/test_result_3.txt
./test/test_result_4.txt
一行一行地给你透彻讲解,os.listdir() 如同去翻抽屉那般,将 test 文件夹之中所有物品的名称罗列出来。
有个名为 os.path.join()的东西,它宛如那种特别温和善良的人,会理所当然地主动帮助你去添加恰当合适的斜杠。
我所带领过的学员当中,起码有一半之人在这儿遭遇了问题:自行进行使用,并且拼接路径,在 Windows 系统上汇报错误称找寻不到文件。

记住,永远用os.path.join(),别自己拼。
企业级实战:f-string 让代码更优雅
项目里咱们不能光打印,得真干活。
下面这个版本添加了异常捕获,进行了并且边界判断,f - string 拼接路径相较于 os.path.join()更为直观:
import os
cnt = 1 #第一个 txt 文件的末尾为 1,所以设置 cnt 为 1
TEMP = []
for i in range(0,4): #这里循环 4 次,因为文件夹中有 4 个 txt 文件
temp_name = "test_result_" + str(cnt) + ".txt"
cnt = cnt + 1
prexfix_path = "/test/" #这里是指所在文件夹的路径,
txt_path = os.path.join(prexfix_path, temp_name)
#下面将 txt_path 输入到需要的函数中,假设本例中是 txt_read()函数的参数是 txt 文件路径
# run()函数返回的结果保存到 result 中
result = txt_read(txt_path)
#将每次的结果 result 添加到 TEMP 中, 从而可以使得
TEMP.append(result)
print(TEMP)
# 运行环境:Python 3.8+,依赖:无
import os
def batch_process_txt(folder_path='./test'):
"""
批量处理 test 文件夹下所有 txt 文件
入参:folder_path - 文件夹路径,默认'./test'
出参:返回处理后的文件内容字典
"""
# 边界条件:检查文件夹是否存在
if not os.path.exists(folder_path):
raise FileNotFoundError(f'文件夹不存在:{folder_path}')
# 边界条件:检查是否为文件夹
if not os.path.isdir(folder_path):
raise NotADirectoryError(f'{folder_path}不是文件夹')
results = {}
try:
# 只处理.txt 文件,过滤掉其他乱七八糟的
for filename in os.listdir(folder_path):
if filename.endswith('.txt'):
# 重点来了!
f-string 直接嵌入变量,比 format 简洁太多
# 传统写法:'{}/{}'.format(folder_path, filename)
# f-string 写法:一目了然
file_path = f'{folder_path}/{filename}'
# 打开文件读取内容
with open(file_path, 'r', encoding='utf-8') as f:
content = f.read().strip()
results[filename] = content
print(f'✅ 已处理:{filename}')
except PermissionError:
print(f'❌ 权限不足,无法读取{folder_path}下的文件')
except Exception as e:
print(f'❌ 未知错误:{e}')
return results
# 调用示例
if __name__ == '__main__':
data = batch_process_txt()
print(f'n 总共处理了{len(data)}个文件')
带上学员去踩过的实实在在的坑:存在这样一个学员,运用 f-string 去写 f“test/{filename}.txt” ,进而导致路径当中多出来了一个点,怎么找都无论如何找不到那个所需要的文件。

避坑口诀:用 f-string 拼接前,先打印变量看看长啥样。
f-string 背后的原理:为什么比 format 香
temp = "test_result_1"
PATH = f"test/{temp}.txt"
print(PATH)
# 输出:test/test_result_1.txt
str.format()时代咱们这么写:
# 参数少还行,多了眼睛花
path = 'test/{}_{}.txt'.format(name, index)
f 字符串的本质,乃是编译时进行的优化,变量是直接被内嵌进去 的,其运行速度会更快。
更关键的是,f-string 里面可以写简单表达式:
for i in range(1, 5):
# 直接在花括号里做运算,爽不爽?
file_path = f'./test/test_result_{i}.txt'
print(file_path)
再来一个实实在在的坑:存在学员于 f-string 当中使用中文引号,呈现为 f“test/{i}.txt”这种形式,结果直接就报出语法错误来了。
name = "xiaoming"
age = 18
print("hi, i am {}. i am {}".format(name, age))
# 输出: hi, i am xiaoming. i am 18
记好了,f - string 外部运用双引号,其内部变量采用花括号,千万不要搞混使用中文标点符号。
终极对比:os.path.join() vs f-string 怎么选?
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 跨平台部署(Windows/Linux) | os.path.join() |
自动处理斜杠差异 |
| 纯 Linux/Mac 环境 | f-string | 代码更短,性能更好 |
| 路径+文件名+扩展名动态拼接 | os.path.join() |
避免多拼或少拼斜杠 |
| 简单文件名遍历 | f-string | 一眼看懂,省事 |
name = "xiaoming"
age = 18
print(f"hi, i am {name}. i am {age}")
# 输出: hi, i am xiaoming. i am 18
关于我的实战方面给出的建议是,要是去写工具库的话,那就采用 os.path.join()这种方式来保障兼容性,而要是写脚本的话,那就自己运用 f-string 这种方式来提升效率。
今儿就着手练习:将 test 文件夹转变为 data/results 这种多级目录,运用两种不同的方法各自展开遍历,瞧瞧哪一种所出现的报错数量更少。

Comments NOTHING