在单个目录下批量重命名文件时找不到指定的文件

Cannot find the file specified when batch renaming files in a single directory

我已经创建了一个简单的脚本来重命名我的媒体文件,这些文件中有很多奇怪的句点和我已经获得并想进一步组织的东西。我的脚本有点工作,我将编辑它以进一步编辑文件名,但我的 os.rename 行抛出此错误:

[Windows错误:错误2:系统找不到指定的文件。]

import os
for filename in os.listdir(directory):
    fcount = filename.count('.') - 1              #to keep the period for the file extension
    newname = filename.replace('.', ' ', fcount)
    os.rename(filename, newname)

有人知道这是为什么吗?我有一种感觉,它不喜欢我在不包含文件路径的情况下尝试重命名文件?

尝试

os.rename(filename, directory + '/' + newname);

看来我只需要设置默认目录就可以了。

folder = r"blah\blah\blah"    
os.chdir(folder)
for filename in os.listdir(folder):
    fcount = filename.count('.') - 1
    newname = filename.replace('.', ' ', fcount)
    os.rename(filename, newname)

Triton Man 已经回答了你的问题。如果他的回答不起作用,我会尝试使用绝对路径而不是相对路径。

我以前做过类似的事情,但为了避免发生任何名称冲突,我暂时将所有文件移动到一个子文件夹中。整个过程发生得如此之快,以至于在 Windows Explorer 中我从未看到子文件夹被创建。

无论如何,如果您有兴趣查看我的脚本,它如下所示。您 运行 命令行上的脚本,您应该将要重命名的 jpg 文件的目录作为命令行参数传入。

这是我用来将 .jpg 文件重命名为 10 的倍数的脚本。看看它可能会有用。

'''renames pictures to multiples of ten'''
import sys, os

debug=False

try:
    path = sys.argv[1]
except IndexError:
    path = os.getcwd()

def toint(string):
    '''changes a string to a numerical representation
    string must only characters with an ordianal value between 0 and 899'''
    string = str(string)
    ret=''
    for i in string:
        ret += str(ord(i)+100) #we add 101 to make all the numbers 3 digits making it easy to seperate the numbers back out when we need to undo this operation
    assert len(ret) == 3 * len(string), 'recieved an invalid character. Characters must have a ordinal value between 0-899'
    return int(ret)

def compare_key(file):
    file = file.lower().replace('.jpg', '').replace('dscf', '')
    try:
        return int(file)
    except ValueError:
        return toint(file)

#files are temporarily placed in a folder
#to prevent clashing filenames
i = 0
files = os.listdir(path)
files = (f for f in files if f.lower().endswith('.jpg'))
files = sorted(files, key=compare_key)
for file in files:
    i += 10
    if debug: print('renaming %s to %s.jpg' % (file, i))
    os.renames(file, 'renaming/%s.jpg' % i)

for root, __, files in os.walk(path + '/renaming'):
    for file in files:
        if debug: print('moving %s to %s' % (root+'/'+file, path+'/'+file))
        os.renames(root+'/'+file, path+'/'+file)

编辑:我摆脱了所有 jpg 绒毛。您可以使用此代码重命名您的文件。只需更改 rename_file 函数即可去除多余的点。我还没有测试过这段代码,所以它可能无法正常工作。

import sys, os

path = sys.argv[1]

def rename_file(file):
    return file

#files are temporarily placed in a folder
#to prevent clashing filenames
files = os.listdir(path)
for file in files:
    os.renames(file, 'renaming/' + rename_file(file))

for root, __, files in os.walk(path + '/renaming'):
    for file in files:
        os.renames(root+'/'+file, path+'/'+file)