如何使用Python复制和重命名目录中的所有文件?

时间:2018-01-16 23:25:44

标签: python python-3.x file

我正在尝试将所有jpeg文件从一个目录(具有多个子目录)复制到一个目录。有多个文件具有相同的名称,因此我尝试使用父目录的名称重命名文件。例如:c:\ images \ tiger \ image_00001.jpg将被移动到新文件夹并重命名为c:\ images \ allimages \ tiger_image_00001.jpg。我尝试了下面的代码,但没有任何反应。文件夹已创建,但文件不会移动。这就是我到目前为止所做的:

import os
path = 'source/'
os.mkdir('source/allimages/')
extensions = ['.jpeg']
for folder, _, filenames in os.walk(path):
    for filename in filenames:
        if folder == path or folder == os.path.join(path, 'allimages'):
            continue
        folder = folder.strip(path)
        extension = os.path.splitext(os.path.splitext(filename)[0])[-1].lower()
        if extension in extensions:
            infilename = os.path.join(path, folder, filename)
            newname = os.path.join(path, 'all_files', "{}-{}".format(folder.strip('./')))
            os.rename(infilename, newname)

2 个答案:

答案 0 :(得分:1)

我建议使用专用于解析唯一文件名的函数。一个while循环应该可以解决问题。这应该有用。

import os
import shutil

def resolve_path(filename, destination_dir):
    dest = os.path.join(destination_dir, filename)
    *base_parts, extension = filename.split('.')
    base_name = '.'.join(base_parts)
    duplicate_num = 1
    while os.path.exists(dest):
        new_base = base_name + str(duplicate_num).zfill(5)
        new_filename = "{}.{}".format(new_base, extension)
        dest = os.path.join(destination_dir, new_filename)
        duplicate_num += 1
    return dest

这就是以下结果......

>>> with open('/path/to/file.extension', 'w') as f:
>>>     pass # just create the file
>>> resolve_path('file.extension', '/path/to/')
'/path/to/file00001.extension'        

然后将其与遍历源......放在一起......

def consolidate(source, destination, extension='.jpg'):
    if not os.path.exists(destination):
        os.makedirs(destination)
    for root, dirs, files in os.walk(source):
        for f in files:
            if f.lower().endswith(extension):
                source_path = os.path.join(root, f)
                destination_path = resolve_path(f, destination)
                shutil.copyfile(source_path, destination_path)

答案 1 :(得分:0)

您在自己的输出上调用splitext,但是没有得到您想要的内容:

In [4]: os.path.splitext(os.path.splitext('foo.bar')[0])[-1]
Out[4]: ''

您只需要extension = os.path.splitext(filename)[-1].lower(),或者如果您不想要该点,那么extension = os.path.splitext(filename)[-1].lower()[1:]

(编辑)更严重的是,folder.strip(path)存在问题:这将从文件夹中删除路径中的所有字符。例如'source/rescue'.strip('source/') == ''。你想要的是folder.replace(path, '')