需求:一次性将文件夹中指定的所有txt后缀名文件修改成py文件(或者其他后缀名)
工程路径:https://github.com/geekcomputers/Python batch_file_rename.py
以下是对这个代码的学习和记录
def batch_rename(work_dir, old_ext, new_ext):
"""
This will batch rename a group of files in a given directory,
once you pass the current and new extensions
"""
# files = os.listdir(work_dir)
for filename in os.listdir(work_dir):
# Get the file extension
split_file = os.path.splitext(filename)
file_ext = split_file[1]
# Start of the logic to check the file extensions, if old_ext = file_ext
if old_ext == file_ext:
# Returns changed name of the file with new extention
newfile = split_file[0] + new_ext
# Write the files
os.rename(
os.path.join(work_dir, filename),
os.path.join(work_dir, newfile)
)
print("rename is done!")
print(os.listdir(work_dir))
先看这段代码,通过注释很容易看出思路。先解释一下其中几个函数。
-
listdir
实现的功能见下图,列出指定文件夹中的所有文件
-
Splitext
分离文件名与扩展名;默认返回(fname,fextension)元组,可做分片操作
-
join
str.join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
Python中有join()和os.path.join()两种,具体使用方式如下:
os.path.join(): 将多个路径组合后返回,一般需要拼接路径就会用到这个函数 -
rename
下图就是将D:\Test目录下的20191026.txt修改成了20191026.py,其中圈出来的部分出现文件找不到的错误是因为路径单斜杠应该改成双斜杠,学过C语言的都知道单斜杠是转义字符,“\\”才表示单斜杠的意思。所以不要搞错啦。
os.rename 方法用于重命名文件或目录,从 src 到 dst,如果dst是一个存在的目录, 将抛出OSError
现在再来看那段代码就很清晰:输入3个参数:文件夹路径work_dir,已存在的文件后缀名old_ext,目标修改的文件后缀名new_ext。将指定文件夹下的文件名和后缀拆分开,并与输入的后缀名做比较,如果一致就将该后缀名的文件名与目标后缀名组合到一起并重命名。最终实现某个文件夹下指定后缀名的文件统一修改成其他后缀。
接下来我们看看另外一块代码
def get_parser():
parser = argparse.ArgumentParser(description='change extension of files in a working directory')
parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1,
help='the directory where to change extension')
parser.add_argument('old_ext', metavar='OLD_EXT', type=str, nargs=1, help='old extension')
parser.add_argument('new_ext', metavar='NEW_EXT', type=str, nargs=1, help='new extension')
return parser
其实对我来说,这块更加是重点,因为argparser模块确实研究了好久才知道怎么用。
资料上大都是这么说的:argparse 是python自带的命令行参数解析包,可以用来方便地读取命令行参数。
那我们来看看怎么方便的读取命令行参数。
import argparse
parser = argparse.ArgumentParser(description = '请输入一个字符串')
parser.add_argument('str')
args = parser.parse_args()
print(args.str)
将这块代码写到.py中,形成argparse_use_test.py,然后在命令行下执行,如下
我执行了三次,
第一次没有到带任何参数,显示error需要一个参数str
第二次带参数-h,显示了代码里的描述信息“请输入一个字符串”,还说str是定位参数,-h是可选参数、可以显示帮助信息和退出,那估计我这样用就是显示了帮助信息,而且还退出了。
第三次带了一个字符串,并且与代码的目标一致打印了这个字符串。
好像大概就知道这个模块怎么用了......
但是又没有那么简单。
上面有谈到定位参数和可选参数,顾名思义,可选参数就是可以选择不赋值的参数呗。但是在这个project中,用到的都是定位参数,我们得赋值3个参数,即work_dir,old_ext和new_ext
等有时间再继续记录argparser模块的详细使用