如何用Python检测共享文件夹中的随机命名JPG文件并处理?
嘿,这个需求其实不难实现,我给你两种靠谱的方案,你可以根据场景选:
方案一:定时扫描目录(轮询法)
这是最贴合你原本思路的做法,每隔一段时间扫描共享目录,找出符合格式的图片文件逐个处理,不用提前知道文件名。
实现思路:
- 用
glob.glob或os.listdir筛选目录里的.jpg文件 - 先尝试打开文件(避免处理PC2还没上传完成的不完整文件)
- 成功验证后加载图片、执行处理逻辑,最后删除文件
代码示例:
import os import glob import time from PIL import Image # 用PIL处理图片,需先安装:pip install pillow SHARED_DIR = "你的共享目录绝对路径" while True: # 筛选所有jpg文件,也可以精准匹配你的命名规则:glob.glob(os.path.join(SHARED_DIR, "data-*.jpg")) image_files = glob.glob(os.path.join(SHARED_DIR, "*.jpg")) for img_path in image_files: # 验证文件是否已上传完成(避免读取到半写入的文件) try: with open(img_path, 'rb'): pass except PermissionError: # 文件还在上传中,跳过本次循环,下次扫描再处理 continue # 执行图像处理逻辑 try: img = Image.open(img_path) print(f"开始处理图片:{img_path}") # 这里替换成你的图像处理代码,比如裁剪、识别等 # img.show() # 处理完成后删除文件 os.remove(img_path) print(f"已处理并删除:{img_path}") except Exception as e: print(f"处理图片失败:{e}") # 可根据情况决定是否保留文件,或跳过后续操作 # 无文件时等待1秒 time.sleep(1)
注意点:
- 一定要加文件打开验证,否则容易读取到损坏的不完整图片
- 如果共享目录有其他无关文件,可以用更精准的匹配规则(比如
data-*.jpg)过滤
方案二:实时监控目录变化(事件驱动法)
如果轮询的1秒间隔太长,或者想更高效,可以用watchdog库实时监听目录的文件创建事件,新图片一上传就立刻处理,不用反复扫描。
实现步骤:
- 先安装依赖:
pip install watchdog - 继承
FileSystemEventHandler类,重写文件创建事件的处理逻辑 - 启动监控器,持续监听共享目录
代码示例:
import os import time from PIL import Image from watchdog.observers import Observer from watchdog.events import FileSystemEventHandler SHARED_DIR = "你的共享目录绝对路径" class ImageUploadHandler(FileSystemEventHandler): def on_created(self, event): # 忽略目录创建事件,只处理文件 if event.is_directory: return # 只处理jpg格式的文件 if event.src_path.endswith(".jpg"): # 短暂等待确保文件上传完成(事件触发时可能还在写入) time.sleep(0.5) try: # 加载并处理图片 img = Image.open(event.src_path) print(f"实时处理图片:{event.src_path}") # 替换成你的图像处理逻辑 # 处理完成后删除文件 os.remove(event.src_path) except Exception as e: print(f"实时处理失败:{e}") if __name__ == "__main__": event_handler = ImageUploadHandler() observer = Observer() # 监听指定目录,不递归子目录 observer.schedule(event_handler, SHARED_DIR, recursive=False) observer.start() try: # 保持监控运行 while True: time.sleep(1) except KeyboardInterrupt: # 按下Ctrl+C停止监控 observer.stop() observer.join()
注意点:
- 文件创建事件触发时,PC2可能还在写入数据,所以加个短延迟更稳妥
- 这种方法比轮询更高效,适合对实时性要求高的场景
两种方案各有优劣:轮询法简单无需额外依赖,事件驱动法更实时高效,你可以根据自己的需求选择~
内容的提问来源于stack exchange,提问作者BhanuKiran
相关产品推荐
相关产品推荐

