Python更改文件的一部分nam

2024-06-08 13:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

嗨,我有很多不同的文件需要重命名为其他文件。我已经做到了这一点,但我希望它能让我有很多项要替换,以及它们相应的替换项,而不是逐个键入,运行代码,然后重新键入。我还需要重命名只改变文件的一部分,而不是全部,所以如果有一个“Cat5e_1mbend1bottom50m2 bend2top-Aqeoiu31”,它只需将其更改为“Cat5e50m1mBED_50m2mBE2U-Aqeoiu31” 运行python2.5

import os, glob

name_map = {
     "Cat5e_1mBend1bottom50m2mBend2top": 'Cat5e50m1mBED_50m2mBE2U'
}

#searches for roots, directory and files
for root,dirs,files in os.walk(r"H:\My Documents\CrossTalk"):
   for f in files:
       if f in name_map:
          try:
             os.rename(os.path.join(root, f), os.path.join(root, name_map[f]))
          except FileNotFoundError, e:
          #except FileNotFoundError as e:  # python 3
             print(str(e))

Tags: 文件pathnameinmapfor键入os
3条回答

像那样的?在

files = ['something', 'nothing', 'no_really_not',
         'something_something', 'nothing_to_replace']
name_map = {'nothing': 'something',
            'something': 'nothing'}

for f in files:
    for pat, rep  in name_map.iteritems():
        if f.find(pat) >= 0:
            f_new = f.replace(pat, rep)
            print('Rename {} -> {}'.format(f, f_new))
            break
    else:
        print('Keep {}'.format(f))

那真是太普通了。如果一个文件需要多次替换,那就不好了。。。在

你一定要看看regular expressions。在

如果您有需要更改和替换的模式定义,那么使用re.sub非常简单

正如Hector所指出的,完成这项任务最简单的方法是使用正则表达式。幸运的是,Python有一个优秀的正则表达式模块re。从本质上说,我们要查看在name_map中指定的任何模式是否与当前正在查看的文件匹配。如果模式匹配,则只有匹配的部分是子基,然后重命名。在

import os, glob, re

name_map = {
    "bad": "good",
    "cat": "dog"
}

for root, dirs, files in os.walk(r"/Users/.../start/"):
    for f in files:
        for name in name_map.keys():
            if re.search(name,f) != None:
                new_name = re.sub(name,name_map[name],f)
                try:
                    os.rename(os.path.join(root,f), os.path.join(root, new_name))
                except OSError:
                    print "No such file or directory!"

因此,给定一个目录start,其中包含以下内容: bad_name.txtcatdogcat.csv

此脚本将它们重命名为: good_name.txtdogdogdog.csv

这两个主要的收获应该是如何使用re.search()和{}方法。re.search(pattern, string)在提供的字符串中查找模式。如果找到它,它将返回一个Match对象,如果没有,则返回None。这使得测试字符串中的模式变得轻而易举。一旦我们发现模式存在,下一步就是用我们的新名称替换它。输入re.sub()方法。re.sub(pattern, replace, string)在提供的字符串中搜索模式,然后用replace的内容替换该模式。在

我强烈建议您看看the docs for the ^{} module,因为它非常强大,可以用来解决许多问题。在

相关问题 更多 >