使用 Python 重命名目录中的多个文件

2025-01-21 09:01:00
admin
原创
70
摘要:问题描述:我正在尝试使用 Python 重命名目录中的某些文件。假设我有一个名为的文件CHEESE_CHEESE_TYPE.***并想删除CHEESE_,那么最终的文件名将是CHEESE_TYPE我尝试使用,os.path.split但无法正常工作。我也考虑过使用字符串操作,但也没有成功。解决方案 1:用于o...

问题描述:

我正在尝试使用 Python 重命名目录中的某些文件。

假设我有一个名为的文件CHEESE_CHEESE_TYPE.***并想删除CHEESE_,那么最终的文件名将是CHEESE_TYPE

我尝试使用,os.path.split但无法正常工作。我也考虑过使用字符串操作,但也没有成功。


解决方案 1:

用于os.rename(src, dst)重命名或移动文件或目录。

$ ls
cheese_cheese_type.bar  cheese_cheese_type.foo
$ python
>>> import os
>>> for filename in os.listdir("."):
...  if filename.startswith("cheese_"):
...    os.rename(filename, filename[7:])
... 
>>> 
$ ls
cheese_type.bar  cheese_type.foo

解决方案 2:

这是根据您的最新评论编写的脚本。

#!/usr/bin/env python
from os import rename, listdir

badprefix = "cheese_"
fnames = listdir('.')

for fname in fnames:
    if fname.startswith(badprefix*2):
        rename(fname, fname.replace(badprefix, '', 1))

解决方案 3:

以下代码应该可以工作。它获取当前目录下的每个文件名,如果文件名包含模式CHEESE_CHEESE_,则将其重命名。如果不包含,则不对文件名执行任何操作。

import os
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))

解决方案 4:

假设您已进入目录,并且注释中的“前 8 个字符”始终成立。(尽管“CHEESE_”是 7 个字符……?如果是这样,请将下面的 8 改为 7)

from glob import glob
from os import rename
for fname in glob('*.prj'):
    rename(fname, fname[8:])

解决方案 5:

我遇到了同样的问题,我想将任何 pdf 文件中的空格替换为破折号-。但这些文件位于多个子目录中。所以,我不得不使用os.walk()。对于多个子目录,它可能是这样的:

import os
for dpath, dnames, fnames in os.walk('/path/to/directory'):
    for f in fnames:
        os.chdir(dpath)
        if f.startswith('cheese_'):
            os.rename(f, f.replace('cheese_', ''))

解决方案 6:

尝试一下:

import os
import shutil

for file in os.listdir(dirpath):
    newfile = os.path.join(dirpath, file.split("_",1)[1])
    shutil.move(os.path.join(dirpath,file),newfile)

我假设您不想删除文件扩展名,但您可以使用句点进行相同的拆分。

解决方案 7:

这种东西非常适合具有 shell 集成的 IPython。

In [1] files = !ls
In [2] for f in files:
           newname = process_filename(f)
           mv $f $newname

注意:要将其存储在脚本中,请使用.ipy扩展名,并在所有 shell 命令前加上前缀!

另请参阅: http: //ipython.org/ipython-doc/stable/interactive/shell.html

解决方案 8:

这是一个更通用的解决方案:

此代码可用于从目录内的所有文件名中递归删除任何特定字符或字符集,并将其替换为任何其他字符、字符集或无字符。

import os

paths = (os.path.join(root, filename)
        for root, _, filenames in os.walk('C:FolderName')
        for filename in filenames)

for path in paths:
    # the '#' in the example below will be replaced by the '-' in the filenames in the directory
    newname = path.replace('#', '-')
    if newname != path:
        os.rename(path, newname)

解决方案 9:

看来您的问题更多在于确定新文件名而不是重命名本身(您可以使用 os.rename 方法)。

从您的问题中看不出您想要重命名的模式是什么。字符串操作没有错。正则表达式可能是您在这里所需要的。

解决方案 10:

导入操作系统导入字符串def rename_files():

#List all files in the directory
file_list = os.listdir("/Users/tedfuller/Desktop/prank/")
print(file_list)

#Change current working directory and print out it's location
working_location = os.chdir("/Users/tedfuller/Desktop/prank/")
working_location = os.getcwd()
print(working_location)

#Rename all the files in that directory
for file_name in file_list:
    os.rename(file_name, file_name.translate(str.maketrans("","",string.digits)))

重命名文件()

解决方案 11:

此命令将使用renamer从当前目录中的所有文件中删除初始的“CHEESE_”字符串:

$ renamer --find "/^CHEESE_/" *

解决方案 12:

我最初正在寻找一些允许使用正则表达式重命名并在应用更改之前预览结果的 GUI。

在 Linux 上,我已成功使用krename,在 Windows 上 Total Commander 使用正则表达式重命名,但我找不到适用于 OSX 的免费等效程序,因此我最终编写了一个 Python 脚本,该脚本以递归方式工作,默认情况下仅打印新文件名而不进行任何更改。添加“-w”开关可实际修改文件名。

#!/usr/bin/python
# -*- coding: utf-8 -*-

import os
import fnmatch
import sys
import shutil
import re


def usage():
    print """
Usage:
        %s <work_dir> <search_regex> <replace_regex> [-w|--write]

        By default no changes are made, add '-w' or '--write' as last arg to actually rename files
        after you have previewed the result.
        """ % (os.path.basename(sys.argv[0]))


def rename_files(directory, search_pattern, replace_pattern, write_changes=False):

    pattern_old = re.compile(search_pattern)

    for path, dirs, files in os.walk(os.path.abspath(directory)):

        for filename in fnmatch.filter(files, "*.*"):

            if pattern_old.findall(filename):
                new_name = pattern_old.sub(replace_pattern, filename)

                filepath_old = os.path.join(path, filename)
                filepath_new = os.path.join(path, new_name)

                if not filepath_new:
                    print 'Replacement regex {} returns empty value! Skipping'.format(replace_pattern)
                    continue

                print new_name

                if write_changes:
                    shutil.move(filepath_old, filepath_new)
            else:
                print 'Name [{}] does not match search regex [{}]'.format(filename, search_pattern)

if __name__ == '__main__':
    if len(sys.argv) < 4:
        usage()
        sys.exit(-1)

    work_dir = sys.argv[1]
    search_regex = sys.argv[2]
    replace_regex = sys.argv[3]
    write_changes = (len(sys.argv) > 4) and sys.argv[4].lower() in ['--write', '-w']
    rename_files(work_dir, search_regex, replace_regex, write_changes)

示例用例

我想以以下方式翻转文件名的各个部分,即将位移动m7-08到文件名的开头:

# Before:
Summary-building-mobile-apps-ionic-framework-angularjs-m7-08.mp4

# After:
m7-08_Summary-building-mobile-apps-ionic-framework-angularjs.mp4

这将执行一次试运行,并打印新文件名而不实际重命名任何文件:

rename_files_regex.py . "([^.]+?)-(m\\d+-\\d+)" "\\2_\\1"

这将执行实际的重命名(您可以使用-w--write):

rename_files_regex.py . "([^.]+?)-(m\\d+-\\d+)" "\\2_\\1" --write

解决方案 13:

您可以使用 os.system 函数来简单调用 bash 来完成任务:

import os
os.system('mv old_filename new_filename')

解决方案 14:

这对我有用。

import os
for afile in os.listdir('.'):
    filename, file_extension = os.path.splitext(afile)
    if not file_extension == '.xyz':
        os.rename(afile, filename + '.abc')

解决方案 15:

那这个呢:

import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用