我正在尝试将所有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)
答案 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, '')
。