Python文件循环-最佳实践



我想知道如果我循环处理一堆文件来操作它们,什么会更好。

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)

对于第二种情况,是像示例中那样在函数内部还是外部打开图像更好?

在干净的代码方面,什么更好?

我的观点是,这取决于您想要实现的封装级别。

第一种情况

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

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

这就是为什么我更喜欢选项2d,不过,让我们走得更远。

第二种情况

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

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

如果在任何时候想要重用图像转换逻辑,可以将其移动到一个单独的类或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)

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

其他人也在这里回答了类似的问题。

如果您对低级别的性能感兴趣,这里解释了为什么循环在循环中可能更快。

正如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

最新更新