使用 python 和 os.walk() 重命名子文件夹中的文件
Rename files in subfolders with python and os.walk()
我想重命名两个父目录的子文件夹中的所有文件,用下划线替换空格。这是我的结构:
parent folder
folder 1
TIFF
image 1
image 2
[...]
folder 2
TIFF
image 1
image 2
[...]
[...]
这是我想要的结果:
parent folder
folder_1
TIFF
image_1
image_2
[...]
folder_2
TIFF
image_1
image_2
[...]
[...]
这是我正在使用的脚本,到目前为止还没有执行任何操作:
#!/usr/local/bin/python3
import os
def replace(parent):
for path, folders, files in os.walk(parent):
for i in range(len(folders)):
os.chdir("TIFF")
for f in files:
os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
new_name = folders[i].replace(' ', '_')
os.rename(os.path.join(path, folders[i]), os.path.join(path, new_name))
folders[i] = new_name
我忽略了什么?
您可能 运行 在 os.walk
浏览完文件夹之前重命名了文件夹。这可以通过设置topdown=False
来解决。现在您将首先收到最低的文件和文件夹。
那么您可以先更新文件,再更新文件夹。
import os
def rename(path, file):
old_file = os.path.join(path, file)
new_file = os.path.join(path, file.replace(' ', '_'))
os.rename(old_file, new_file)
def replace(parent):
for path, folders, files in os.walk(parent, topdown=False):
print(path, folders, files)
for file in files:
rename(path, file)
for folder in folders:
rename(path, folder)
编辑
以下结构和代码用于测试脚本:
- 文件夹结构
└───parent
├───folder 1
│ └───TIFF
│ ├─── file 1.txt
│ └─── file 2.txt
├───folder 2
│ └───TIFF
│ ├─── file 1.txt
│ └─── file 2.txt
└─── main.py
- 代码
main.py
import os
def rename(path, file):
old_file = os.path.join(path, file)
new_file = os.path.join(path, file.replace(' ', '_'))
os.rename(old_file, new_file)
def replace(parent):
for path, folders, files in os.walk(parent, topdown=False):
print(path, folders, files)
for file in files:
rename(path, file)
for folder in folders:
rename(path, folder)
if __name__ == '__main__':
parent = os.path.dirname(__file__)
replace(os.path.join(parent, 'parent'))
在 os.walk()
中执行 os.chdir()
几乎肯定是错误的。
此外,请注意不要在遍历子目录时重命名父目录。
#!/usr/local/bin/python3
import os
def replace(parent):
remembrance = []
for path, folders, files in os.walk(parent):
if os.path.basename(path) == "TIFF":
for f in files:
os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
elif "TIFF" in folders:
remembrance.append((path, os.path.join(os.path.dirname(path), os.path.basename(path).replace(" ", "_"))))
for src, dst in remembrance:
os.rename(src, dst)
您的代码从不调用 replace()
,所以也许这是您缺少的第一件事。声明一个函数只是告诉 Python 如果您稍后调用该函数以及何时调用该函数该怎么做。
如果你真的不需要递归,就这样做
import os
import glob
def underscorify(path):
os.rename(path, os.path.join(os.path.dirname(path), os.path.basename(path).replace(" ", "_"))
for file in glob.glob("*/TIFF/*"):
underscorify(file)
for dirname in glob.glob("*/"):
if os.path.exists(os.path.join(dirname), "TIFF"):
underscorify(dirname)
当你使用os.chdir
方法时,因为你的工作目录总是在变化,你应该使用os.getcwd
查看当前的工作目录,你会知道哪里出了问题,然后改变工作目录先parent,然后你可以随意更改它。
我想重命名两个父目录的子文件夹中的所有文件,用下划线替换空格。这是我的结构:
parent folder
folder 1
TIFF
image 1
image 2
[...]
folder 2
TIFF
image 1
image 2
[...]
[...]
这是我想要的结果:
parent folder
folder_1
TIFF
image_1
image_2
[...]
folder_2
TIFF
image_1
image_2
[...]
[...]
这是我正在使用的脚本,到目前为止还没有执行任何操作:
#!/usr/local/bin/python3
import os
def replace(parent):
for path, folders, files in os.walk(parent):
for i in range(len(folders)):
os.chdir("TIFF")
for f in files:
os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
new_name = folders[i].replace(' ', '_')
os.rename(os.path.join(path, folders[i]), os.path.join(path, new_name))
folders[i] = new_name
我忽略了什么?
您可能 运行 在 os.walk
浏览完文件夹之前重命名了文件夹。这可以通过设置topdown=False
来解决。现在您将首先收到最低的文件和文件夹。
那么您可以先更新文件,再更新文件夹。
import os
def rename(path, file):
old_file = os.path.join(path, file)
new_file = os.path.join(path, file.replace(' ', '_'))
os.rename(old_file, new_file)
def replace(parent):
for path, folders, files in os.walk(parent, topdown=False):
print(path, folders, files)
for file in files:
rename(path, file)
for folder in folders:
rename(path, folder)
编辑
以下结构和代码用于测试脚本:
- 文件夹结构
└───parent
├───folder 1
│ └───TIFF
│ ├─── file 1.txt
│ └─── file 2.txt
├───folder 2
│ └───TIFF
│ ├─── file 1.txt
│ └─── file 2.txt
└─── main.py
- 代码
main.py
import os
def rename(path, file):
old_file = os.path.join(path, file)
new_file = os.path.join(path, file.replace(' ', '_'))
os.rename(old_file, new_file)
def replace(parent):
for path, folders, files in os.walk(parent, topdown=False):
print(path, folders, files)
for file in files:
rename(path, file)
for folder in folders:
rename(path, folder)
if __name__ == '__main__':
parent = os.path.dirname(__file__)
replace(os.path.join(parent, 'parent'))
在 os.walk()
中执行 os.chdir()
几乎肯定是错误的。
此外,请注意不要在遍历子目录时重命名父目录。
#!/usr/local/bin/python3
import os
def replace(parent):
remembrance = []
for path, folders, files in os.walk(parent):
if os.path.basename(path) == "TIFF":
for f in files:
os.rename(os.path.join(path, f), os.path.join(path, f.replace(' ', '_')))
elif "TIFF" in folders:
remembrance.append((path, os.path.join(os.path.dirname(path), os.path.basename(path).replace(" ", "_"))))
for src, dst in remembrance:
os.rename(src, dst)
您的代码从不调用 replace()
,所以也许这是您缺少的第一件事。声明一个函数只是告诉 Python 如果您稍后调用该函数以及何时调用该函数该怎么做。
如果你真的不需要递归,就这样做
import os
import glob
def underscorify(path):
os.rename(path, os.path.join(os.path.dirname(path), os.path.basename(path).replace(" ", "_"))
for file in glob.glob("*/TIFF/*"):
underscorify(file)
for dirname in glob.glob("*/"):
if os.path.exists(os.path.join(dirname), "TIFF"):
underscorify(dirname)
当你使用os.chdir
方法时,因为你的工作目录总是在变化,你应该使用os.getcwd
查看当前的工作目录,你会知道哪里出了问题,然后改变工作目录先parent,然后你可以随意更改它。