我需要在不同的文件夹中获得最大大小的文件,将它们的名称更改为它们所属的文件夹名,并保存到一个新文件夹中。我有这样的东西我被卡住了:
import os
# Core settings
rootdir = 'C:\\Users\\X\\Desktop\\humps'
to_save = 'C:\\Users\\X\\Desktop\\new'
for root, dirs, files in os.walk(rootdir):
new_list = []
for file in files:
if file.endswith(".jpg"):
try:
print(file)
os.chdir(to_save)
add_id = root.split("humps\\")[1]
add_id = add_id.split("\\")[0]
file_name = os.path.join(root,file)
new_list.append(file_name)
bigfile = max(new_list, key=lambda x: x.stat().st_size)
except:
pass为了让它更清楚:假设子文件夹的名称是“大象”,在这个大象文件夹中有不同的大象照片和子文件夹。我想通过这些照片和子文件夹,找到大象的最大大小,命名为大象,并将它保存到我的目标文件夹。也重新为其他子文件夹,如狮子,美洲狮等。我如何才能实现我想要的?
发布于 2017-09-03 23:23:47
如何获取文件夹中最大大小的文件,更改其名称并保存到其他文件夹
基本上,你已经有一个很好的描述,你需要做什么。你只需要一步一步地遵循它:
将任务分解为较小的任务是一项重要的技能。然后,只需实现较小的任务并组合:
def iterate_files_recursively(directory="."):
for entry in os.scandir(directory):
if entry.is_dir():
for file in iterate_files_recursively(entry.path):
yield file
else:
yield entry
files = iterate_files_recursively(subfolder_name)我之所以使用os.scandir,是因为它避免了在内存中建立(潜在的)庞大的文件列表,而是允许我(通过生成器)一次工作一个文件。注意,从3.6开始,您可以使用os.scandir的结果作为上下文管理器(with语法)。
images = itertools.filterfalse(lambda f: not f.path.endswith('.jpg'), files)过滤相对简单,除了IMO奇怪的选择ìtertools.filterfalse只保留其谓词返回False的元素。
biggest = max(images, key=(lambda img: img.stat().st_size))这是一个步骤中的两个步骤:使用内置的max函数获取最大值,并使用文件大小作为“键”来建立订单。注意,如果您没有任何图像,则会引发ValueError .因此,您可能需要提供default=None或处理该异常。
shutil.copy(biggest.path, os.path.join(target_directory, subfolder_name + '.jpg')shutil.copy复制文件和一些元数据。不要硬编码路径分隔符,请使用os.path.join!
现在,所有这些都假设您了解subfolder_name。你也可以很容易地扫描到:
def iterate_directories(directory='.'):
for entry in os.scandir(directory):
if entry.is_dir():
yield entry发布于 2017-09-01 11:31:05
查找最大的文件并保存到另一个位置
import os
import shutil
f_list = []
root = "path/to/directory"
root = os.path.abspath(root)
for folder, subfolders, files in os.walk(root):
for file in files:
filePath = os.path.join(folder, file)
f_list.append(filePath)
bigest_file = max(f_list,key=os.path.getsize)
new_path = "path/where/you/want/to/save"
shutil.copy(biggest_file,new_path)如果您只需要图像,那么在循环中再添加一个条件。
for folder, subfolders, files in os.walk(root):
for file in files:
if file.endswith(".jpg"):
filePath = os.path.join(folder, file)
f_list.append(filePath)获取所有文件夹最大的文件
root = "demo"
root = os.path.abspath(root)
def test(path):
big_files = []
all_paths = [x[0] for x in os.walk(path)]
for paths in all_paths:
f_list = filter(os.path.isfile, os.listdir(paths))
if len(f_list) > 0:
big_files.append((paths,max(f_list,key=os.path.getsize)))
return big_files
print test(root)发布于 2017-09-01 11:04:08
这里有一些代码可以实现你想要的。它没有使用旧的os.walk函数,而是使用了现代的pathlib函数。
此代码的核心是递归biggest函数。它扫描folder中的所有文件和目录,将匹配的文件名保存到files列表中,并递归搜索它找到的任何目录。然后,它返回它找到的最大文件的路径,如果没有找到匹配的文件,则返回None。
from pathlib import Path
import shutil
def filesize(path):
return path.stat().st_size
def biggest(folder, pattern):
''' Find the biggest file in folder that matches pattern
Search recursively in all subdirectories
'''
files = []
for f in folder.iterdir():
if f.is_file():
if f.match(pattern):
files.append(f)
elif f.is_dir():
found = biggest(f, pattern)
if found:
files.append(found)
if files:
return max(files, key=filesize)
def copy_biggest(src, dest, pattern):
''' Find the biggest file in each folder in src that matches pattern
and copy it to dest, using the folder's name as the new file name
'''
for path in src.iterdir():
if path.is_dir():
found = biggest(path, pattern)
if found:
newname = dest / path
print(path, ':', found, '->', newname)
shutil.copyfile(found, newname)你可以这样称呼它:
rootdir = r'C:\Users\X\Desktop\humps'
to_save = r'C:\Users\X\Desktop\new'
copy_biggest(Path(rootdir), Path(to_save), '*.jpg')请注意,复制的文件将具有与在rootdir中找到的顶级文件夹相同的名称,没有文件扩展名。如果您想给他们一个.jpg扩展,您可以更改
newname = dest / path至
newname = (dest / path).with_suffix('.jpg')在较早版本的Python3上的shutil模块不理解pathlib路径。但这很容易补救。在copy_biggest函数中,替换
shutil.copyfile(found, newname)使用
shutil.copyfile(str(found), str(newname))https://stackoverflow.com/questions/45983601
复制相似问题