Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python复制和重命名目录中的所有文件?_Python_Python 3.x_File - Fatal编程技术网

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

如何使用Python复制和重命名目录中的所有文件?,python,python-3.x,file,Python,Python 3.x,File,我正在尝试将所有jpeg文件从一个目录(具有多个子目录)复制到一个目录。有多个文件具有相同的名称,因此我尝试使用父目录的名称重命名这些文件。例如:c:\images\tiger\image\u 00001.jpg将被移动到新文件夹并重命名为c:\images\allimages\tiger\u image\u 00001.jpg。我尝试了下面的代码,但什么也没发生。将创建文件夹,但文件不会移动。这就是我到目前为止所做的: import os path = 'source/' os.mkdir('

我正在尝试将所有jpeg文件从一个目录(具有多个子目录)复制到一个目录。有多个文件具有相同的名称,因此我尝试使用父目录的名称重命名这些文件。例如:c:\images\tiger\image\u 00001.jpg将被移动到新文件夹并重命名为c:\images\allimages\tiger\u image\u 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)

您正在对其自己的输出调用splitext,但该输出无法得到您想要的结果:

In [4]: os.path.splitext(os.path.splitext('foo.bar')[0])[-1]
Out[4]: ''
您只需要
extension=os.path.splitext(文件名)[-1].lower()
,或者如果您不需要点,那么
extension=os.path.splitext(文件名)[-1].lower()[1:


(已编辑)更严重的是,
文件夹出现问题。strip(path)
:这将从文件夹中删除path中的所有字符。例如
'source/rescue'.strip('source/')=''
。您需要的是文件夹。替换(路径“”)我建议使用专用于解析唯一文件名的函数。一个
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)

什么不适用于当前方法?将\更改为\\或/。还有,什么应该是“\source\”?如果它是一个相对路径,那么它应该是“source/”或“./source/”,所以本质上什么都不会发生。它创建了一个文件夹,就这样。文件无法移动。所以我尝试了你的建议,但不确定出了什么问题。我得到了新文件夹,但没有复制文件。@user40929-请参阅上面我编辑的答案。如果仍然不行,我建议添加一些print语句,以确保真正了解代码中完成工作的部分。例如,将
print(extension)
放在
之前,如果extension中的extension:
是扩展名,请查看它的外观。诸如此类的事情。所以我尝试了下面的代码,基本上程序进入了一个循环,它不断地创建数百万个文件。示例文件名:img_0000005502070。jpg@user40929我最近更新了答案。我测试过了,它不应该有那个问题。行了!非常感谢你。真的很感激!当然可以如果这对您有效,请确保将答案标记为已接受。干杯,欢迎来到SO!