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