摘要
建議的變化如下:
- 使用
os.getcwd()
,而不是"."
似乎因爲沒有得到解決你所希望的方式。這將在診斷功能中進行說明。
- 使用相對路徑重命名由
os.chdir(root)
。當然,使用正確絕對路徑也可以,但恕我直言相對路徑更加優雅。
- 像其他人提到的那樣,將一個明確的字符串傳遞到
os.walk()
。
另請注意,topdown=False
在os.walk()
並不重要。由於您不重命名目錄,因此在os.walk()
期間目錄結構將保持不變。
代碼示例
原始文件結構:
[email protected]:/mnt/ramdisk/test$ tree .
.
├── outer
│ ├── inner
│ │ └── innermost.txt
│ └── inner.txt
├── outer.txt
└── rename.py
代碼:
# -*- coding: utf-8 -*-
import os
def renamefiles(path):
for root, dirs, files in os.walk(path, topdown=False):
for f in files:
# chdir before renaming
os.chdir(root)
if f != "rename.py": # avoid renaming this file
os.rename(f, "renamed.txt") # relative path, more elegant
renamefiles(os.getcwd()) # pass an unambiguous string
導致文件結構:
[email protected]:/mnt/ramdisk/test$ tree .
.
├── outer
│ ├── inner
│ │ └── renamed.txt
│ └── renamed.txt
├── renamed.txt
└── rename.py
下Debian測試8.6 64位,蟒2.7.1 2(Anaconda 4.1.1)。
對於診斷
# -*- coding: utf-8 -*-
import os
def renamefiles_check(path):
for root, dirs, files in os.walk(path, topdown=False):
for f in files:
print "========="
print "os.getcwd() = {}".format(os.getcwd())
print "root = {}".format(root)
print "f = {}".format(f)
print "os.path.abspath(f) = {}".format(os.path.abspath(f))
print "os.path.join(root, f) = {}".format(os.path.join(root, f))
# renamefiles_check(".")
# renamefiles_check(os.getcwd())
的renamefiles_check(".")
前幾行如下所示:
os.getcwd() = /mnt/ramdisk/test
root = ./outer/inner
f = innermost.txt
os.path.abspath(f) = /mnt/ramdisk/test/innermost.txt
os.path.join(root, f) = ./outer/inner/innermost.txt
您可以驗證:
行爲os.path.abspath(f)
不是所需 (不是說它'錯誤的)。它始終綁定到傳遞到os.walk()
而不是包含文件f
的路徑的參數path
。
當"."
作爲path
通過時,os.path.join(root, f)
中的點仍未完全解析。
示例代碼避免了這些含糊之處。
您沒有正確使用'os.walk',請參閱(http://stackoverflow.com/questions/10989005/do-i-understand-os-walkright) – TemporalWolf
您不應該發佈答案您的更新代碼。用您的更新編輯原始問題並刪除「答案」,因爲他們不回答問題。 – TemporalWolf