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

Jef*_*eff 401 python file-io file-rename

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

假设我有一个调用的文件,CHEESE_CHEESE_TYPE.***并希望删除CHEESE_所以我的结果文件名将是CHEESE_TYPE

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

Mes*_*ssa 633

使用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
Run Code Online (Sandbox Code Playgroud)

  • 你得到了"找不到文件"因为文件名不是绝对路径.在调用重命名之前显式调用path和os.path.join(path,filename),它会起作用. (17认同)
  • @Jeff我发现保存脚本并将其放在我将运行它的目录中要容易得多.这样,os.rename方法可以正常工作.缺点是您最终可能会重命名脚本本身.你可以创建一个名为`dir`的变量并使用它,然后将`dir`添加到`filename`,而不是使用`.`作为目录. (5认同)
  • 将文件名传递给os.rename的完整路径更好,而不仅仅是文件名. (5认同)
  • 我从Windows得到一个错误,说它无法找到该文件,它没有做任何事情......任何提示? (4认同)

buk*_*zor 37

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

#!/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))
Run Code Online (Sandbox Code Playgroud)


Yog*_*han 19

以下代码应该有效.它接受当前目录中的每个文件名,如果文件名包含模式CHEESE_CHEESE_,则重命名.如果没有对文件名做任何事情.

import os
for fileName in os.listdir("."):
    os.rename(fileName, fileName.replace("CHEESE_CHEESE_", "CHEESE_"))
Run Code Online (Sandbox Code Playgroud)


dar*_*elf 15

假设您已经在目录中,并且评论中的"前8个字符"始终为true.(虽然"CHEESE_"是7个字符......?如果是这样,将下面的8改为7)

from glob import glob
from os import rename
for fname in glob('*.prj'):
    rename(fname, fname[8:])
Run Code Online (Sandbox Code Playgroud)


Azi*_*lto 11

我有同样的问题,我想将 in any pdf file to a dash -.但文件位于多个子目录中.所以,我不得不使用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_', ''))
Run Code Online (Sandbox Code Playgroud)


krs*_*rs1 7

试试这个:

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)
Run Code Online (Sandbox Code Playgroud)

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

  • 覆盖内置'文件'通常是不好的做法. (8认同)
  • @bukzor 7年后,我将对此进行扩展:"压倒内置组件通常是不好的做法." (2认同)

Eri*_*lun 6

这种东西非常适合IPython,它具有shell集成.

In [1] files = !ls
In [2] for f in files:
           newname = process_filename(f)
           mv $f $newname
Run Code Online (Sandbox Code Playgroud)

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

另见:http://ipython.org/ipython-doc/stable/interactive/shell.html


nic*_*las 5

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

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

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)
Run Code Online (Sandbox Code Playgroud)