ChatGPT解决这个技术问题 Extra ChatGPT

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

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

假设我有一个名为 CHEESE_CHEESE_TYPE.*** 的文件并想要删除 CHEESE_,因此我的结果文件名将是 CHEESE_TYPE

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

您的针不在大海捞针中,您的大海捞针有一个通配符,即使忽略这种情况,您的结果也不能来自大海捞针。关心一下这个问题吗?
好的,我会尽力清理它。我有一个文件文件夹,所有文件都被命名为 cheese_cheese_type.prj (前 15 个字符相同,但尾随 4 个字符和扩展名不同)我试图从文件名中删除前 8 个字符(在示例中,'cheese_ ' 将被删除,生成的文件名将是 cheese_type.prj 所以我要做的是遍历目录,拆分文件名,并从文件名中删除前 8 个字符。输入将是 cheese_cheese_type.prj,输出将是 cheese_type。谢谢!
How to rename a file using Python 相似但不同

M
Messa

使用 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

我从 Windows 收到一个错误,说它找不到文件,而且它什么也没做……有什么提示吗?
@Jeff我发现保存脚本并将其放置在我将运行它的目录中要容易得多。这样, os.rename 方法可以正常工作。缺点是您最终可能会重命名脚本本身。您可以创建一个名为 dir 的变量并使用它,然后将 dir 添加到 filename,而不是使用 . 作为目录。
你得到“找不到文件”,因为文件名不是绝对路径。在调用重命名之前显式调用 path 和 os.path.join(path, filename) 它将起作用。
最好使用传递给 os.rename 的文件名的完整路径,而不仅仅是文件名。
b
bukzor

这是基于您最新评论的脚本。

#!/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))

Y
Yogeesh Seralathan

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

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

d
darelf

假设您已经在目录中,并且您的评论中的“前 8 个字符”始终成立。 (虽然“CHEESE_”是7个字符...?如果是的话,把下面的8改成7)

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

A
Aziz Alto

我有同样的问题,我想将任何 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_', ''))

L
Lake

尝试这个:

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)

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


覆盖内置的“文件”通常是不好的做法。
@bukzor 7 年后,我将对此进行扩展:“覆盖内置函数通常是不好的做法。”
E
Erik Kaplun

这种东西非常适合具有 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


每条线的作用是什么?
n
nicholas

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

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

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)

U
Uri

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

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


T
Ted Fuller

导入操作系统导入字符串定义重命名文件():

#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)))

重命名文件()


L
Lloyd

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

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

npm (JavaScript) ≠ python。不妨链接到 Perl rename 命令。
c
ccpizza

我最初是在寻找一些允许使用正则表达式重命名的 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

这是另一个脚本,您可以为它编写 replacement_functions 并运行它们,对于每个脚本,它都会向您显示将要进行的更改的预览,其中差异用颜色突出显示,并要求确认 gist.github.com/aljgom/81e8e4ca9584b481523271b8725448b8
佚名

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

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

这仅适用于 posix 系统。
e
edib

这对我有用。

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

B
Bandan

那这个呢 :

import re
p = re.compile(r'_')
p.split(filename, 1) #where filename is CHEESE_CHEESE_TYPE.***

这不回答问题!