之前的
文章,里面在用PIL生成验证码图片时,设置字体时一开始这样写的font=ImageFont.truetype('times.ttf',size=40)
且字体文件和这句代码所在文件都处于同一个目录,理论上引用处于同一目录内的文件时是可以直接使用被引用文件名的。用pycharm在本地启动这个项目,验证码图片正常生成。可是将所有项目文件上传到服务器(腾讯云CentOS),在服务器上用uwsgi启动项目,验证码图片却加载失败了,uwsgi的日志里有报错OSError: cannot open resource,说明字体没有加载成功。要么是从系统中复制出字体文件时手动修改了文件名,要么是加载时路径不对。我是复制系统的Times New Roman 常规,就叫times.ttf,所以是加载时路径不对。
然后换个稍微规范点的写法,这样也不行。
font=ImageFont.truetype('./times.ttf',size=40)
可以使用os模块来遍历指定路径下的文件夹和文件。首先,需要使用os.listdir()或os.scandir()函数获取指定路径下的所有文件和文件夹,然后使用os.path.isdir()函数判断是否是文件夹,如果是文件夹并且包含名为"2023"的文件夹,则使用递归的方式进入该文件夹并遍历其中的文件。具体实现代码如下:
import os
def traverse_folders(path):
for file_or_folder in os.listdir(path):
file_or_folder_path = os.path.join(path, file_or_folder)
if os.path.isdir(file_or_folder_path):
if "2023" in os.listdir(file_or_folder_path): # 判断是否包含名为"2023"的文件夹
traverse_folders(os.path.join(file_or_folder_path, "2023")) # 递归进入该文件夹并遍历其中的文件
else:
# 处理文件的操作
pass
其中,path为需要遍历的文件夹路径。调用该函数即可开始遍历。
如果需要遍历多个文件夹,并且只想读取每个文件夹中名为"2023"的文件夹中的文件,则可以在遍历时增加判断,具体实现代码如下:
def traverse_folders(paths):
for path in paths:
for file_or_folder in os.listdir(path):
file_or_folder_path = os.path.join(path, file_or_folder)
if os.path.isdir(file_or_folder_path):
if file_or_folder == "2023" and "2023" in os.listdir(file_or_folder_path):
traverse_folders(os.path.join(file_or_folder_path, "2023"))
else:
continue # 不是名为"2023"的文件夹,跳过不处理
else:
# 处理文件的操作
pass
其中,paths为需要遍历的多个文件夹路径,使用for循环依次遍历每个文件夹。在遍历文件夹时,增加对名为"2023"的文件夹的判断,如果符合条件则进入该文件夹并遍历其中的文件。如果不符合条件,则跳过不处理。
如果需要精确搜索指定的文件夹和文件,可以使用glob模块来实现,具体实现方法为:
import glob
folders = glob.glob('/path/to/folder/*2023') # 获取指定路径下名为"2023"的文件夹
for folder in folders:
files = glob.glob(folder + '/*.txt') # 获取每个文件夹下的txt格式文件
for file in files:
# 处理文件的操作
pass
其中,可以使用glob.glob()函数来获取指定路径下符合条件的文件或文件夹。在本例中,首先使用glob.glob()获取指定路径下名为"2023"的文件夹,然后使用for循环逐一处理每个文件夹下的txt格式文件。