首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取文件夹中最大大小的文件,更改其名称并保存到其他文件夹

如何获取文件夹中最大大小的文件,更改其名称并保存到其他文件夹
EN

Stack Overflow用户
提问于 2017-08-31 14:11:46
回答 3查看 2.8K关注 0票数 1

我需要在不同的文件夹中获得最大大小的文件,将它们的名称更改为它们所属的文件夹名,并保存到一个新文件夹中。我有这样的东西我被卡住了:

代码语言:javascript
复制
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

为了让它更清楚:假设子文件夹的名称是“大象”,在这个大象文件夹中有不同的大象照片和子文件夹。我想通过这些照片和子文件夹,找到大象的最大大小,命名为大象,并将它保存到我的目标文件夹。也重新为其他子文件夹,如狮子,美洲狮等。我如何才能实现我想要的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-09-03 23:23:47

如何获取文件夹中最大大小的文件,更改其名称并保存到其他文件夹

基本上,你已经有一个很好的描述,你需要做什么。你只需要一步一步地遵循它:

  1. 获取某个搜索目录中的所有文件
  2. 过滤相关文件("*.jpg")
  3. 得到他们的尺寸
  4. 找出最大值
  5. 复制到具有搜索目录名称的新目录

将任务分解为较小的任务是一项重要的技能。然后,只需实现较小的任务并组合:

代码语言:javascript
复制
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语法)。

代码语言:javascript
复制
images = itertools.filterfalse(lambda f: not f.path.endswith('.jpg'), files)

过滤相对简单,除了IMO奇怪的选择ìtertools.filterfalse只保留其谓词返回False的元素。

代码语言:javascript
复制
biggest = max(images, key=(lambda img: img.stat().st_size))

这是一个步骤中的两个步骤:使用内置的max函数获取最大值,并使用文件大小作为“键”来建立订单。注意,如果您没有任何图像,则会引发ValueError .因此,您可能需要提供default=None或处理该异常。

代码语言:javascript
复制
shutil.copy(biggest.path, os.path.join(target_directory, subfolder_name + '.jpg')

shutil.copy复制文件和一些元数据。不要硬编码路径分隔符,请使用os.path.join

现在,所有这些都假设您了解subfolder_name。你也可以很容易地扫描到:

代码语言:javascript
复制
def iterate_directories(directory='.'):
  for entry in os.scandir(directory):
    if entry.is_dir():
      yield entry
票数 1
EN

Stack Overflow用户

发布于 2017-09-01 11:31:05

查找最大的文件并保存到另一个位置

代码语言:javascript
复制
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)

如果您只需要图像,那么在循环中再添加一个条件。

代码语言:javascript
复制
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)

获取所有文件夹最大的文件

代码语言:javascript
复制
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)
票数 2
EN

Stack Overflow用户

发布于 2017-09-01 11:04:08

这里有一些代码可以实现你想要的。它没有使用旧的os.walk函数,而是使用了现代的pathlib函数。

此代码的核心是递归biggest函数。它扫描folder中的所有文件和目录,将匹配的文件名保存到files列表中,并递归搜索它找到的任何目录。然后,它返回它找到的最大文件的路径,如果没有找到匹配的文件,则返回None

代码语言:javascript
复制
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)

你可以这样称呼它:

代码语言:javascript
复制
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扩展,您可以更改

代码语言:javascript
复制
newname = dest / path

代码语言:javascript
复制
newname = (dest / path).with_suffix('.jpg')

在较早版本的Python3上的shutil模块不理解pathlib路径。但这很容易补救。在copy_biggest函数中,替换

代码语言:javascript
复制
shutil.copyfile(found, newname)

使用

代码语言:javascript
复制
shutil.copyfile(str(found), str(newname))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45983601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档