使用 Python 重命名目录,其中包含文件名
Rename a directory with a filename inside with Python
我正在尝试用其中第一个文件的名称重命名几个目录。
我正在尝试:
- 列出文件夹中的文件。
- 确定目录。
- 对于每个目录,访问它,获取其中第一个文件的名称并使用该名称重命名目录。
这是我目前得到的结果,但没有用。我知道代码是错误的,但在修复代码之前我想知道逻辑是否正确。有人可以帮忙吗?
import os
for (root, dirs, files) in os.walk('.'):
print(f'Found directory: {dirpath}')
dirlist = []
for d_idx, d in enumerate(dirlist):
print(d)
filelist = []
for f_idex, f in enumerate(filelist):
files.append(f)[1]
print(f)
os.rename(d, f)
谢谢!
您的代码中存在一些问题:
- 您在使用
os.walk
迭代目录时正在重命名目录。这不是一个好主意,os.walk
为您提供了一个生成器,这意味着它会在您迭代它们时创建元素,因此在循环中重命名会混淆它。
for d_idx, d in enumerate(dirlist):
和 for f_idex, f in enumerate(filelist):
都遍历在前一行中声明为空列表的变量,因此这些循环不执行任何操作。此外,在第二个中,files.append(f)
会将 f
附加到列表 files
,但末尾的 [1]
表示 "get the second element (remeber Python indexing is 0-based) of the value returned by the append
function" - 但 append
没有 return 任何东西(它修改列表,而不是 return 一个新列表),所以这会失败(而且你没有使用 [1]
读取的值,所以它会什么都不做)。
- 在
os.rename(d, f)
中,首先,由于之前的循环永远不会 运行,d
和 f
将没有值,而且,假设两者 d
和 f
来自 dirs
和 files
,它们将作为相对于其父目录的路径给出,而不是相对于您的当前目录 (.
),因此重命名会失败。
这段代码应该可以正常工作:
import os
# List of paths to rename
renames = []
# Walk current dir
for (root, dirs, files) in os.walk('.'):
# Skip this dir (cannot rename current directory)
if root == '.': continue
# Add renaming to list
renames.append((root, files[0]))
# Iterate renaming list in reverse order so deepest dirs are renamed first
for root, new_name in reversed(renames):
# Make new full dir name (relative to current directory)
new_full_name = os.path.join(os.path.dirname(root), new_name)
# Rename
os.rename(root, new_full_name)
我正在尝试用其中第一个文件的名称重命名几个目录。
我正在尝试:
- 列出文件夹中的文件。
- 确定目录。
- 对于每个目录,访问它,获取其中第一个文件的名称并使用该名称重命名目录。
这是我目前得到的结果,但没有用。我知道代码是错误的,但在修复代码之前我想知道逻辑是否正确。有人可以帮忙吗?
import os
for (root, dirs, files) in os.walk('.'):
print(f'Found directory: {dirpath}')
dirlist = []
for d_idx, d in enumerate(dirlist):
print(d)
filelist = []
for f_idex, f in enumerate(filelist):
files.append(f)[1]
print(f)
os.rename(d, f)
谢谢!
您的代码中存在一些问题:
- 您在使用
os.walk
迭代目录时正在重命名目录。这不是一个好主意,os.walk
为您提供了一个生成器,这意味着它会在您迭代它们时创建元素,因此在循环中重命名会混淆它。 for d_idx, d in enumerate(dirlist):
和for f_idex, f in enumerate(filelist):
都遍历在前一行中声明为空列表的变量,因此这些循环不执行任何操作。此外,在第二个中,files.append(f)
会将f
附加到列表files
,但末尾的[1]
表示 "get the second element (remeber Python indexing is 0-based) of the value returned by theappend
function" - 但append
没有 return 任何东西(它修改列表,而不是 return 一个新列表),所以这会失败(而且你没有使用[1]
读取的值,所以它会什么都不做)。- 在
os.rename(d, f)
中,首先,由于之前的循环永远不会 运行,d
和f
将没有值,而且,假设两者d
和f
来自dirs
和files
,它们将作为相对于其父目录的路径给出,而不是相对于您的当前目录 (.
),因此重命名会失败。
这段代码应该可以正常工作:
import os
# List of paths to rename
renames = []
# Walk current dir
for (root, dirs, files) in os.walk('.'):
# Skip this dir (cannot rename current directory)
if root == '.': continue
# Add renaming to list
renames.append((root, files[0]))
# Iterate renaming list in reverse order so deepest dirs are renamed first
for root, new_name in reversed(renames):
# Make new full dir name (relative to current directory)
new_full_name = os.path.join(os.path.dirname(root), new_name)
# Rename
os.rename(root, new_full_name)