批量替换多级子目录下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} 中未找到目标字符串")
关键修正点
- 模块导入修正:Python的系统模块是小写
os,原代码的import OS会导致后续报错。 - 正确遍历文件:通过
os.walk()的返回值root, dirs, files获取真实的文件路径和文件名,而非重复调用生成器。 - 筛选目标文件:用
endswith('.csv')过滤出需要处理的CSV文件。 - 路径拼接规范:用
os.path.join()拼接路径,避免手动拼接出现的跨平台兼容性问题。 - 文件句柄自动管理:
with语句会自动关闭文件,原代码手动调用file.close()是多余操作。
内容的提问来源于stack exchange,提问作者Gen1224
相关产品推荐
相关产品推荐

