我想写一个小脚本来管理我得到的一堆文件。这些文件具有复杂且不同的名称,但它们的名称中都包含一个数字。我想取这个数字,把它放在文件名前面,这样它们就可以在我的文件系统中逻辑列出。
我使用os.listdir获得了所有这些文件的列表,但我很难找到找到这些文件中的数字的方法。我已经检查了正则表达式,但我不确定这是否是正确的方法!
示例:
import os
files = os.litdir(c:\\folder)
files
['xyz3.txt' , '2xyz.txt', 'x1yz.txt']`
基本上,我最终想要的是:
1xyz.txt
2xyz.txt
3xyz.txt
我到目前为止所遇到的是在列表文件中找到这些数字(1,2,3)
答案 0 :(得分:2)
此(未经测试的)代码段应显示正则表达式方法。编译模式的search
方法用于查找数字。如果找到,则将数字移动到文件名的前面。
import os, re
NUM_RE = re.compile(r'\d+')
for name in os.listdir('.'):
match = NUM_RE.search(name)
if match is None or match.start() == 0:
continue # no number or number already at start
newname = match.group(0) + name[:match.start()] + name[match.end():]
print 'renaming', name, 'to', newname
#os.rename(name, newname)
如果此代码在生产中使用而不是作为家庭作业,则有用的改进是将match.group(0)
解析为整数并将其格式化为包含多个前导零。这样foo2.txt
将变为02foo.txt
并在12bar.txt
之前排序。实现这一点是留给读者的练习。
答案 1 :(得分:0)
假设文件名中的数字是整数(未经测试的代码):
def rename(dirpath, filename):
inds = [i for i,char in filename if char in '1234567890']
ints = filename[min(inds):max(inds)+1]
newname = ints + filename[:min(inds)] + filename[max(inds)+1:]
os.rename(os.path.join(dirpath, filename), os.path.join(dirpath, newname))
def renameFilesInDir(dirpath):
""" Apply your renaming scheme to all files in the directory specified by dirpath """
dirpath, dirnames, filenames = os.walk(dirpath):
for filename in filenames:
rename(dirpath, filename)
for dirname in dirnames:
renameFilesInDir(os.path.join(dirpath, dirname))
希望这有帮助