Python,图像压缩和多处理

2024-04-29 05:12:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用Python来研究多处理问题,但我做不到。请注意,我过去、现在、甚至可能永远都是编程方面的一个呆子。啊,不管怎样。给你。在

我正在编写一个Python脚本,它使用来自用户的预定义变量将图像压缩到带有ImageMagick的文件夹中,存储在ini文件中。该脚本在下载目录中搜索与模式匹配的文件夹,检查它们是否包含jpg、PNGs或其他图像文件,如果包含,则重新压缩并重命名它们,并将结果存储在“compressed”文件夹中。在

现在,事情是这样的:如果我能“并行化”整个压缩,我会很高兴的,但是。。。我不明白我该怎么做。在

我不想让你厌倦现有的代码,因为它简直是糟糕透顶。这只是一个简单的“for file in directory”循环。这就是我想并行化的——有人能给我举个例子说明多处理是如何与目录中的文件一起使用的吗?在

我的意思是,让我们看一段简单的代码:

对于匹配的_目录中的f: print('我要处理文件:',f)

对于那些不得不偷看代码的人来说,我想这里是整个并行化部分:

for f in ImageFolders:
    print (splitter)
    print (f)
    print (splitter)
    PureName = CleanName(f)
    print (PureName)
    for root, dirs, files in os.walk(f):
        padding = int(round( math.log( len(files), 10))) + 1
        padding = max(minpadding, padding)
        filecounter = 0
        for filename in files:
            if filename.endswith(('.jpg', '.jpeg', '.gif', '.png')):
                filecounter += 1
                imagefile, ext = os.path.splitext(filename)
                newfilename = "%s_%s%s" % (PureName, (str(filecounter).rjust(padding,'0')), '.jpg')
                startfilename = os.path.join (f, filename)
                finalfilename = os.path.join(Dir_Images_To_Publish, PureName, newfilename)
                print (filecounter, ':', startfilename, ' >>> ', finalfilename)
                Original_Image_FileList.append(startfilename)
                Processed_Image_FileList.append(finalfilename)

…在这里,我想添加一段代码,工人从原始的_Image_FileList获取第一个文件,并将其从已处理的_Image_FileList压缩为第一个文件名,第二个从后面的文件中获取一个,等等,直到特定数量的工人-这取决于ini文件中的用户设置。在

有什么想法吗?在


Tags: 文件代码inimage目录文件夹foros
1条回答
网友
1楼 · 发布于 2024-04-29 05:12:37

您可以使用Pool类创建一个worker池,您可以将图像压缩分发到该类。请参阅multiprocessing文档的Using a pool of workers部分。在

例如,如果您的压缩函数被称为compress(filename),那么您可以使用Pool.map方法将此函数应用于返回文件名的iterable,即列表matching_directory

from multiprocessing import Pool

def compress_image(image):
  """Define how you'd like to compress `image`..."""
  pass

def distribute_compression(images, pool_size = 4):
  with Pool(processes=pool_size) as pool:
    pool.map(compress_image, images)

有多种类似映射的方法可用,请参见map了解初学者。你可以尝试一下游泳池的大小,看看哪个最有效。在

相关问题 更多 >