Python 双层独立循环实现文件批量存储案例
在自动化办公和数据处理场景中,我们经常需要读取 Excel 表格中的数据,并根据配置生成对应的文件。例如,Excel 的一列记录文件名,另一列记录文件内容,目标是将内容写入到指定路径下的对应文件中。
本文通过实际案例演示了 Python 中双层独立循环处理文件时的常见陷阱及解决方案。文章分析了因变量作用域导致的文件名覆盖问题,并提供了使用 zip 函数和 enumerate 索引的正确写法。同时补充了文件路径处理、编码设置及异常捕获等最佳实践,帮助开发者高效完成 Excel 数据到文件的批量写入任务。

在自动化办公和数据处理场景中,我们经常需要读取 Excel 表格中的数据,并根据配置生成对应的文件。例如,Excel 的一列记录文件名,另一列记录文件内容,目标是将内容写入到指定路径下的对应文件中。
本文将以实际案例演示如何利用 Python 的循环结构完成此任务,重点分析常见的逻辑陷阱及正确的解决方案。
假设我们有一个 Excel 文件 TEST.xlsx,其中包含两列:
test1.txt, test2.txt我们需要遍历这两列数据,将内容写入到本地文件夹中。
确保已安装 pandas 库用于处理 Excel 文件:
pip install pandas openpyxl
许多初学者在处理此类需求时,容易写出如下代码:
import pandas as pd
import os
excel_file = 'TEST.xlsx'
target_path = './output/'
# 创建目标文件夹(如果不存在)
os.makedirs(target_path, exist_ok=True)
read_excel = pd.read_excel(excel_file, sheet_name='输出文件内容')
print(read_excel)
table_name = read_excel['文件名']
table_content = read_excel['文件内容']
# 错误的写法:两个独立的循环
for a in table_name:
print(a) # 这里只是打印,a 的值会在循环结束后保留为最后一个值
for b in table_content:
file_path = target_path + a # 这里的 a 已经是第一个循环结束后的最后一个值
with open(file_path, 'w+', encoding='utf-8') as f:
f.write(b)
上述代码看似逻辑清晰,但运行结果往往只有最后一个文件被正确命名,或者所有文件都使用了同一个文件名(即第一个循环遍历到的最后一个文件名)。
这是因为在 Python 中,for 循环变量具有作用域特性。当第一个循环结束时,变量 a 会保留最后一次迭代的值。随后的第二个循环开始执行时,它无法'回溯'获取第一个循环的所有值,只能使用当前内存中 a 的状态。
因此,第二个循环中的 file_path 实际上始终使用的是 table_name 列表的最后一个元素,导致所有写入的文件名都相同,后续文件会覆盖前面的文件。
要解决跨循环的数据关联问题,核心思路是建立索引映射或使用并行迭代工具。以下是两种推荐方案。
zip() 函数可以将多个可迭代对象打包成元组,实现同步遍历。这是最 Pythonic 且简洁的方法。
import pandas as pd
import os
excel_file = 'TEST.xlsx'
target_path = './output/'
os.makedirs(target_path, exist_ok=True)
read_excel = pd.read_excel(excel_file, sheet_name='输出文件内容')
# 提取列为列表
file_names = read_excel['文件名'].tolist()
contents = read_excel['文件内容'].tolist()
# 使用 zip 同步遍历
for name, content in zip(file_names, contents):
# 拼接完整路径
file_path = os.path.join(target_path, str(name))
try:
with open(file_path, 'w+', encoding='utf-8') as f:
f.write(str(content))
print(f'成功写入:{file_path}')
except Exception as e:
print(f'写入失败 {name}: {e}')
优点:
with open 确保文件句柄正确关闭。如果必须分别处理两个列表,可以通过索引来关联它们。
import pandas as pd
import os
excel_file = 'TEST.xlsx'
target_path = './output/'
os.makedirs(target_path, exist_ok=True)
read_excel = pd.read_excel(excel_file, sheet_name='输出文件内容')
file_names = read_excel['文件名'].tolist()
contents = read_excel['文件内容'].tolist()
# 通过索引同时访问
for i in range(len(file_names)):
name = file_names[i]
content = contents[i]
file_path = os.path.join(target_path, str(name))
with open(file_path, 'w+', encoding='utf-8') as f:
f.write(str(content))
注意:此方法要求两个列表长度严格一致,否则可能引发 IndexError。
在实际生产环境中,建议遵循以下规范以提升代码健壮性:
os.path.join 或 pathlib.Path 代替字符串拼接,兼容不同操作系统的路径分隔符。encoding='utf-8',防止中文乱码。try-except 块捕获文件读写异常,避免程序因单个文件错误而中断。Python 的双层独立循环在处理关联数据时存在变量状态残留的风险。通过理解循环变量的作用域机制,我们可以避免此类逻辑错误。推荐使用 zip() 函数进行并行迭代,结合 os.path 和上下文管理器,能够编写出既安全又高效的文件处理脚本。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online