You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量替换多级子目录下CSV文件指定字符串报错求助

问题描述

文件夹结构

|FolderA
|-Foldera1
|      A_a1_001.csv
|      A_a1_002.csv
|-Folderb1
|      A_b1_001.csv
|      A_b1_002.csv

CSV文件格式

A_a1_001.csv内容:

XXX,XXX,XXX,XXX
123,456,789,AAA

A_a1_002.csv内容:

XXX,XXX,XXX,XXX
376,452,953,AAA

需求

遍历根目录下所有CSV文件,查找并替换指定字符串,保存至原路径和文件名。

错误代码

import OS
texttofind='AAA'
texttoreplace='BBB'
sourcepath=os.walk(r"/Users/Gens/Documents/FolderA/")
for file in sourcepath:
    inputfile=os.walk(r"/Users/Gens/Documents/FolderA/")
    with open (inputfile,'r') as inputfile:
        filedata=inputfile.read()
        freq=0
        freq=filedata.count(texttofind)
    destinationpath=os.walk(r"/Users/Gens/Documents/FolderA/")
    filedata=filedata.replace(texttofind,texttoreplace)
    with open(destinationpath,'w')as file:
        file.write(filedata)
    file.close()

报错信息

with open (inputfile,'r') as inputfile:
TypeError: expected str, bytes or os.PathLike object, not generator

解决方法

错误根源

os.walk()返回的是生成器对象,每次迭代会输出(当前目录路径, 子目录列表, 文件列表)三个值。你反复调用os.walk(),还直接把生成器传给open()函数,而open()需要的是具体的文件路径字符串,这就导致了类型错误。

修正后的代码

import os  # 注意模块名是小写的os,Python区分大小写

text_to_find = 'AAA'
text_to_replace = 'BBB'
root_dir = r"/Users/Gens/Documents/FolderA/"

# 遍历根目录下所有层级的目录和文件
for root, dirs, files in os.walk(root_dir):
    # 只处理CSV文件
    for file_name in files:
        if file_name.endswith('.csv'):
            # 拼接完整的文件路径
            file_path = os.path.join(root, file_name)
            
            # 读取文件内容
            with open(file_path, 'r') as f:
                file_data = f.read()
            
            # 统计替换次数(可选,不需要可删除)
            replace_count = file_data.count(text_to_find)
            if replace_count > 0:
                # 执行字符串替换
                file_data = file_data.replace(text_to_find, text_to_replace)
                # 写回原文件
                with open(file_path, 'w') as f:
                    f.write(file_data)
                print(f"已处理: {file_path}, 替换次数: {replace_count}")
            else:
                print(f"{file_path} 中未找到目标字符串")

关键修正点

  1. 模块导入修正:Python的系统模块是小写os,原代码的import OS会导致后续报错。
  2. 正确遍历文件:通过os.walk()的返回值root, dirs, files获取真实的文件路径和文件名,而非重复调用生成器。
  3. 筛选目标文件:用endswith('.csv')过滤出需要处理的CSV文件。
  4. 路径拼接规范:用os.path.join()拼接路径,避免手动拼接出现的跨平台兼容性问题。
  5. 文件句柄自动管理:with语句会自动关闭文件,原代码手动调用file.close()是多余操作。

内容的提问来源于stack exchange,提问作者Gen1224

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 00:55:23