Bootstrap

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[l], sys.argv[2], sys.argv[3])

讨论

本节展示了怎样改变一个指定目录中所有文件的扩展名,涉及范围包括了所有的子目录,以及更下级子目录,以此类推。这种技术很适合在一个文件夹结构中批量修改文件的扩展名,比如针对一个 web 站点的目录树进行修改。可以用这个脚本纠正用程序批量生成文件时所犯的错误。

本节给的代码既可以被用作一个可以随时导人的模块,也可以作为一个脚本并运行在命令行中,而且代码设计得很谨慎,完全是平台无关的。可以传人带点(.)的扩展名也可以传入不带点的,程序在必要时会自行插入点。(作为这种方便性的一个直接后果是,此程序不能处理没有扩展名的文件,也不能直接处理点,在UNIX系统中这种限制有时很让人恼火。)

实现本节解决方案所用的技术,一些完美主义者会认为过于底层–直接用操作字符串的方式来修改处理文件名和扩展名,而不是用os.path 提供的函数。不过这没什么大不了的:用os.path 很好,但是用Python 的强大的字符串工具也很好,

;