循环读取文件行创建多级目录仅生效首行,求问题排查与解决
解决循环读取文件创建目录只处理第一行的问题
嘿,我一眼就看到了你的问题所在——你的脚本只处理第一行,核心原因是文件对象只能被遍历一次!当你第一次在内层循环里读完g这个文件后,文件指针已经跑到末尾了,后面的外层循环再去读g的时候,就没内容了,自然不会继续创建目录。除此之外,代码里还有几个小bug会影响你的预期效果,我来帮你一一修正:
先说说你代码里的几个问题:
- 文件对象耗尽问题:
g是打开的文件对象,第一次遍历后就没有内容了,后续外层循环无法再读取到数据。 - 变量赋值错误:你一开始把
m_bot赋值成了lines.split()[0](这里的lines是来自f的行),这会导致m_bot和m_top完全一样,根本没用到list_bottom.dat里的内容。 - 字符串硬编码错误:内层创建角度目录时,你写了
"m_bot"这个字面量字符串,而不是变量m_bot,这会让目录名变成类似AAA_m_bot_angle_0,而不是你想要的AAA_BBB_angle_0。 - 频繁切换目录的风险:多次
os.chdir()很容易出错,比如如果某个目录创建失败,后续的../切换会让你跑到错误的路径下,逻辑混乱。
修正后的代码(更简洁可靠):
import os # 先把两个文件的内容读取到列表里,避免文件指针耗尽的问题 with open("list_top.dat", "r") as f: # 读取每行的第一个字段,同时过滤空行 top_list = [line.split()[0] for line in f if line.strip()] with open("list_bottom.dat", "r") as g: bottom_list = [line.split()[0] for line in g if line.strip()] # 遍历每个top项 for m_top in top_list: # 创建顶层目录,exist_ok=True避免目录已存在时报错 os.makedirs(m_top, exist_ok=True) # 遍历每个bottom项 for m_bot in bottom_list: # 拼接top_bottom目录路径 bot_dir = os.path.join(m_top, f"{m_top}_{m_bot}") os.makedirs(bot_dir, exist_ok=True) # 创建各个角度的子目录 for angle in range(5): angle_dir = os.path.join(bot_dir, f"{m_top}_{m_bot}_angle_{angle}") os.makedirs(angle_dir, exist_ok=True)
为什么这么改?
- 预读文件到列表:把两个文件的内容先读到列表里,这样每次循环都可以重复遍历,彻底解决了文件指针只能用一次的问题。
- 使用
with语句:自动管理文件的打开和关闭,比手动open()更安全,不会忘记关闭文件。 - 用
os.makedirs()代替mkdir()+chdir():直接创建多级目录(如果需要),还能通过exist_ok=True避免目录已存在的报错,同时不用频繁切换目录,减少路径错误的风险。 os.path.join()拼接路径:自动适配Windows/Linux的路径分隔符,让代码更跨平台。- 过滤空行:避免文件里的空行导致创建无效的空目录。
这样修改后,你的脚本就能正常遍历所有的top和bottom项,创建出你想要的目录结构啦!
内容的提问来源于stack exchange,提问作者hemanta
相关产品推荐
相关产品推荐

