我写了一个小脚本,希望通过我的目录/文件夹进行迭代,并将act替换为csv。实际上,我有11年的扩展名为。act的文件我只想将其替换为。csv
import os
files = os.listdir("S:\folder\folder1\folder2\folder3")
path = "S:\folder\folder1\folder2\folder3\"
#print(files)
for x in files:
new_name = x.replace("act","csv")
os.rename(path+x,path+new_name)
print(new_name)
当我执行这个命令时,它对前五个文件有效,然后在第六个文件失败,出现以下错误:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'S:\folder\folder1\folder2\folder3\file_2011_06.act' -> 'S:\folder\folder1\folder2\folder3\file_2011_06.csv'
当我搜索"S:folderfolder1folder2folder3file_2011_06.act"在文件资源管理器中,打开文件。关于我可以采取哪些其他步骤来调试此问题,是否有任何提示?不可否认,这是我的第一个编程脚本。我试着从小事开始学习。所以,我可能错过了什么…谢谢你!
在您的解决方案中,您使用string的replace
来替换"act"通过"csv"这可能会导致问题,如果你的路径包含"行为"在其他地方,例如,S:\facts\file_2011_01.act
将变成S:\fcsvs\file_2011_01.act
,rename
将抛出FileNotFoundError
,因为rename
不能创建文件夹。
当处理文件名时(例如,连接路径片段,提取文件扩展名,…),我建议使用os.path
或pathlib
而不是直接的字符串操作。
我想用os.walk
提出另一个解决方案。与os.listdir
不同,它在一个循环中递归遍历所有子目录。
import os
def act_to_csv(directory):
for root, folders, files in os.walk(directory):
for file in files:
filename, extension = os.path.splitext(file)
if extension == '.act':
original_filepath = os.path.join(root, file)
new_filepath = os.path.join(root, filename + '.csv')
print(f"{original_filepath} --> {new_filepath}")
os.rename(original_filepath, new_filepath)
另外,我建议在用脚本操作文件之前先备份文件。丢失数据或看到它因为脚本中的错误而变得一团糟会很烦人。
import os
folder="S:\folder\folder1\folder2\folder3\"
count=1
for file_name in os.listdir(folder):
source = folder + file_name
destination = folder + str(count) + ".csv"
os.rename(source, destination)
count += 1
print('All Files Renamed')
print('New Names are')
res = os.listdir(folder)
print(res)