2007-07-20
Python Cookbook 2.17 替换目录树下文件的扩展名
需求:
你需要对一个目录树的文件进行重命名操作,用给定的扩展名替换它们的扩展名.
讨论:
对一个目录树下的所有文件进行操作,使用Python标准库的os.walk是比较方便的:
import os
def swapextensions(dir, before, after):
if before[:1] != '.':
before = '.'+before
thelen = -len(before)
if after[:1] != '.':
after = '.'+after
for path, subdirs, files in os.walk(dir):
for oldfile in files:
if oldfile[thelen:] == before:
oldfile = os.path.join(path, oldfile)
newfile = oldfile[:thelen] + after
os.rename(oldfile, newfile)
if _ _name_ _=='_ _main_ _':
import sys
if len(sys.argv) != 4:
print "Usage: swapext rootdir before after"
sys.exit(100)
swapextensions(sys.argv[1], sys.argv[2], sys.argv[3])
上面的代码说明了如何替换指定目录树下所有文件的扩展名,用于需要批量更新文件名的地方很合适,比如网站.也可以用于更改用批处理下载的文件名称的错误.
上面的代码也被设计成模块,以便别的程序使用,或者通过命令行,它是与平台无关的.你可以传递给它传递带.或者不带.的参数,因为在代码中进行了处理.(当然,这也带来一个负面效果,它不能处理不带任何扩展名的文件,尤其是在类Unix系统下)
上面的代码中使用的默写技术可能让理想主义者认为底层.它直接操作了文件名,而不是使用os.path下面的方法.其实并没有关系,因为Python提供的字符串处理功能也是很方便的.
相关说明:
rename(...)
rename(old, new)
Rename a file or directory.
join(a, *p)
Join two or more pathname components, inserting "\" as needed
你需要对一个目录树的文件进行重命名操作,用给定的扩展名替换它们的扩展名.
讨论:
对一个目录树下的所有文件进行操作,使用Python标准库的os.walk是比较方便的:
import os
def swapextensions(dir, before, after):
if before[:1] != '.':
before = '.'+before
thelen = -len(before)
if after[:1] != '.':
after = '.'+after
for path, subdirs, files in os.walk(dir):
for oldfile in files:
if oldfile[thelen:] == before:
oldfile = os.path.join(path, oldfile)
newfile = oldfile[:thelen] + after
os.rename(oldfile, newfile)
if _ _name_ _=='_ _main_ _':
import sys
if len(sys.argv) != 4:
print "Usage: swapext rootdir before after"
sys.exit(100)
swapextensions(sys.argv[1], sys.argv[2], sys.argv[3])
上面的代码说明了如何替换指定目录树下所有文件的扩展名,用于需要批量更新文件名的地方很合适,比如网站.也可以用于更改用批处理下载的文件名称的错误.
上面的代码也被设计成模块,以便别的程序使用,或者通过命令行,它是与平台无关的.你可以传递给它传递带.或者不带.的参数,因为在代码中进行了处理.(当然,这也带来一个负面效果,它不能处理不带任何扩展名的文件,尤其是在类Unix系统下)
上面的代码中使用的默写技术可能让理想主义者认为底层.它直接操作了文件名,而不是使用os.path下面的方法.其实并没有关系,因为Python提供的字符串处理功能也是很方便的.
相关说明:
rename(...)
rename(old, new)
Rename a file or directory.
join(a, *p)
Join two or more pathname components, inserting "\" as needed