防止 os.walk 在找到一个没有我正在过滤的文件类型的子目录后停止



我正在尝试遍历父目录的子目录,在每个子目录中查找文件名中具有最新日期的.xlsx文件。 我的文件的命名约定是,它们将以日期开头,然后以文件名开头。

例如20180621文件名.xlsx

这样我就可以从每个子目录中找到最新的文件,并在它们上运行我的脚本。

我有以下代码,仅当我在每个目录(包括父目录(中都有一个.xlsx时才有效。 如果我在任何目录中都没有.xlsx,代码将返回ValueError: max() arg is an empty sequence然后退出而不继续搜索。

Parent Directory
----subdirectory1
--------subdirectory1.1
----subdirectory2
----subdirectory3
----etc.
  • 示例 1:如果父目录不包含 .xlsx 文件,即使子目录包含,代码也会以 max(( 空序列退出。

  • 示例 2:如果树中任何位置的文件夹没有 .xlsx 文件,则代码以 max(( 空序列退出。 如果子目录 1.1 没有.xlsx文件,它将退出代码,而不检查子目录 2 或子目录 3。

我怎样才能让os.walk继续搜索所有子目录,即使它找到一个不包含我正在寻找的.xlsx文件的子目录(包括如果父目录没有.xlsx文件(。

for root, dirs, files in os.walk(path):
list_of_files = []
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
largest = max(list_of_files)
print (largest)

os.walk()无法继续,因为引发了异常。不要使用空列表调用max(),捕获异常,或者告诉max()如果列表为空,则返回默认值。

如果没有 excel 文件,您可以轻松跳过最大的测试; 如果列表为空,则if list_of_files:为 false:

for root, dirs, files in os.walk(path):
list_of_files = []
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
largest = None
if list_of_files:
largest = max(list_of_files)
print(largest or 'No Excel files in this directory')

如果您使用的是 Python 3.4 或更高版本,您还可以告诉max()函数在输入列表为空时返回默认值:

for root, dirs, files in os.walk(path):
list_of_files = []
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
largest = max(list_of_files, None)  # None is the default value
print(largest or 'No Excel files in this directory')

最后但并非最不重要的一点是,您可以使用try...except ValueError:来处理引发的异常:

for root, dirs, files in os.walk(path):
list_of_files = []
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
try:
largest = max(list_of_files)
print(largest)
except ValueError:
print('No Excel files in this directory')

可以通过使用fnmatch.filter()函数筛选出匹配的文件来简化代码:

import fnmatch
import os
for root, dirs, files in os.walk(path):
excel_files = fnmatch.filter(files, '*.xlsx')
largest = max(list_of_files, None)

它不会停止,max抛出错误。您可以通过以下几种方式处理此问题:

...
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
if list_of_files:  # if it's not blank...
print(max(list_of_files))

...
for file in files:
if file.endswith(".xlsx"):
list_of_files.append(file)
try:
print(max(list_of_files))
except ValueError:  # something goes wrong with `max` (or `print` I guess)
# what do we do? Probably...
pass

最新更新