Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.rename无法在子目录中成功重命名,尽管使用了recursive=True的glob.glob,仍会抛出FileNotFoundError_Python_Python 3.x_Rename_File Rename_Batch Rename - Fatal编程技术网

Python os.rename无法在子目录中成功重命名,尽管使用了recursive=True的glob.glob,仍会抛出FileNotFoundError

Python os.rename无法在子目录中成功重命名,尽管使用了recursive=True的glob.glob,仍会抛出FileNotFoundError,python,python-3.x,rename,file-rename,batch-rename,Python,Python 3.x,Rename,File Rename,Batch Rename,以下代码用于将cwd和子目录中名为“notes”的文件重命名为“notes.html.pmd”。那些仍然在Python3.7和更早版本上的用户需要摆脱walrus操作符并替换它 fileListOld = glob.glob(f"{(cwd := os.getcwd())}/**/{old_name}", recursive=True) 与 以运行此代码。无论如何,代码如下: #!/usr/bin/env python3.8 import glob, os old_na

以下代码用于将cwd和子目录中名为“notes”的文件重命名为“notes.html.pmd”。那些仍然在Python3.7和更早版本上的用户需要摆脱walrus操作符并替换它

fileListOld = glob.glob(f"{(cwd := os.getcwd())}/**/{old_name}", recursive=True)

以运行此代码。无论如何,代码如下:

#!/usr/bin/env python3.8

import glob, os

old_name = r"notes"

new_name = r"notes.html.pmd"

fileListOld = glob.glob(f"{(cwd := os.getcwd())}/**/{old_name}", recursive=True)
print(fileListOld)

for f in fileListOld:
    os.rename(old_name, new_name)
问题是只在CWD中重命名“notes”,而不在子目录中重命名。此外,Python抛出以下错误:

Traceback (most recent call last):
  File "./rename.py", line 17, in <module>
    os.rename(old_name, new_name)     
FileNotFoundError: [Errno 2] No such file or directory: 'notes' -> 'notes.html.pmd'
回溯(最近一次呼叫最后一次):
文件“/rename.py”,第17行,在
重命名(旧名称、新名称)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“notes”->“notes.html.pmd”
我知道我的问题有点严重。然而,它的不同之处在于,我的代码还打算重命名子目录中的文件,因此recursive=True参数


我做错了什么?递归重命名文件的最简单方法是什么?

您将相同的
旧名称==“notes”
重命名为
新名称==“notes.html.pmd”
而不是使用
glob.glob
提供的路径。我会使用:

#/usr/bin/env/python3
从pathlib导入路径
old_name=“注释”
新建\u name=“notes.html.pmd”
对于路径(“.”.glob(f“**/{old_name}”)中的旧路径:
旧路径.重命名(旧路径.父/新路径名)

我不明白你为什么要用变量
f
迭代
fileListOld
,而用相同的两个变量
old\u name
new\u name
调用
rename
。我的意思是循环不会改变
old\u name
new\u name
的值,但是您正在调用
os.rename(旧名称,新名称)
,就好像每次调用的操作都不一样。一般来说,如果您在某些内容中有一个类似于
的循环,如f:
,而循环体不使用
f
,可能有问题。将赋值表达式设置为
cwd
有什么原因吗?为什么不直接使用
f“{os.getcwd()}/**/{old_name}”
?这段代码似乎忽略了所有内容,除了
old\u name
new\u name
。正如其他人所指出的,这是因为您完全忽略了glob的结果,或者除old\u name和new\u name之外的任何变量。
Traceback (most recent call last):
  File "./rename.py", line 17, in <module>
    os.rename(old_name, new_name)     
FileNotFoundError: [Errno 2] No such file or directory: 'notes' -> 'notes.html.pmd'