Python循环文件 - 最佳实践

时间:2017-10-23 09:07:34

标签: python refactoring

我想知道如果我循环遍历一堆文件来操作它们会更好。

1)在函数内发送了一个路径和循环:

def convert_png_to_jpg(path_to_images):
    all_images = os.listdir(path_to_images)
    for image in all_images:
        # open file
        # do something with my file

2)或者在函数外部进行循环并每次调用函数:

    def convert_png_to_jpg(image):
        # do something with my image

    all_images = os.listdir(path_to_images)
    for image in all_images:
        # open file
        convert_png_to_jpg(image)

对于第二种情况,最好是在函数内部或外部打开图像,如示例所示?

清洁代码方面哪个更好?

3 个答案:

答案 0 :(得分:3)

我的观点是,它取决于你想要达到的封装程度。

第一种情况

在这里,您可以将文件和图像转换工作封装在单个函数中,这很好。现在,考虑一下SOLID原则,这里的单一责任在哪里?最好将此功能拆分为2:

  • 获得流
  • 将图像流转换为所需格式

这就是为什么我更喜欢选项2d,但是,让我们更进一步。

第二种情况

在第二种情况下,您提取了一个从流中转换图像的逻辑(无论来源是什么),这是好的。保持这种方式。

现在,您列出每个文件,打开并传递给转换函数。这听起来像是一个单独的3个动作吗?如果不再重复使用此代码,您可以在此处停止。

如果您想在任何时候重复使用图像转换逻辑,可以将其移至单独的类或helper

我在这里看到两个better /其他选项:

选项#1

def convert_png_to_jpg(image):
       # do something with my image

def convert_to_jpg(filepath):
    # open file
    convert_png_to_jpg(image)

all_images = os.listdir(path_to_images)    for image in all_images:
convert_to_jpg(image) for image in all_images

选项#2

提取转换器并在需要的地方使用它。

class PngToJpgConverter(object):
     def convert(image):
         pass
     def convert_from_file(filepath):
         # open file
         return self.convert(image)

converter = PngToJpgConverter()
all_images = os.listdir(path_to_images)
    for image in all_images:
        converter.convert_from_file(image)

答案 1 :(得分:1)

我会说专注于可读性。如果你的功能很简单,只有几行,就把它放在循环中。否则,单独的函数使代码更容易阅读。

Others have answered similar questions here.

And here is an explanation of why the loop might be faster in a loop如果您对低级别的表现感兴趣。

答案 2 :(得分:0)

第二种选择似乎更好"正如MrPyCharm所评论的那样。

在任何情况下,您最终都可以创建一个包装函数,该函数接受一个列表并将每个元素提供给该函数以进行一些批处理

def batch_convert_png_to_jpg(path_to_images):
    files = os.listdir(path_to_images)
        for image in path_to_images:
            # do the work