Python中解决os.listdir命令读取文件乱序问题方法

news2024/10/5 23:30:23

Python中使用对话框批量打开文件时出现乱序问题的解决方法

    • 一、问题描述
    • 二、os.listdir读取文件乱序问题解决方法

欢迎学习交流!
邮箱: z…@1…6.com
网站: https://zephyrhours.github.io/

一、问题描述

有时候为了方便,我们在进行程序编写时,会使用对话框来批量打开文件,但是使用os.listdir读取文件时,会出现文件乱序问题,此时直接使用sorted命令可能无法解决问题,尤其是遇到一些文件名称编码复杂时。具体如下;

  • 下图是我们在window文件夹中打开时,文件排序方式;

在这里插入图片描述

  • 下面是我们使用os.listdir命令获取的文件命名方式输出,具体代码和结果如下:
from tkinter import filedialog
import os

# 打开文件夹
folder_path = filedialog.askdirectory(title='Open the folder')
img_list = os.listdir(folder_path)
print('img_list:', img_list)

在这里插入图片描述
可以看到,此处的图像名称的排序方式是乱序的,这种情况下往往不方便我们后续的图像处理任务:

D:\anaconda3\envs\csdn\python.exe
C:\Users\zephy\Documents\Python\CSDN\demo_20240702.py
img_list:
[‘0_100000_A.jpg’,
‘0_100000_B.jpg’,
‘0_1000_A.jpg’,
‘0_1000_B.jpg’,
‘0_100_A.jpg’,
‘0_100_B.jpg’,
‘0_1100_A.jpg’,
‘0_1100_B.jpg’,
‘0_1200_A.jpg’,
‘0_1200_B.jpg’,
‘0_2000_A.jpg’,
‘0_2000_B.jpg’,
‘0_200_A.jpg’,
‘0_200_B.jpg’,
‘0_2100_A .jpg’,
‘0_2100_B.jpg’,
‘0_3000_A.jpg’,
‘0_3000_B.jpg’,
‘0_300_A.jpg’,
‘0_300_B.jpg’,
‘0_4000_A.jpg’,
‘0_4000_B.jpg’,
‘0_800_A.jpg’,
‘0_800_B.jpg’,
‘0_90000_A.jpg’,
‘0_90000_B.jpg’,
‘0_900_A.jpg’,
‘0_900_B.jpg’]

Process finished with exit code 0

二、os.listdir读取文件乱序问题解决方法

下面笔者提供一种解决方式,可以实现读取的文件顺序与文件夹浏览顺序保持一致。

from tkinter import filedialog
import os

# 打开文件夹
folder_path = filedialog.askdirectory(title='Open the folder')
img_list = os.listdir(folder_path)

# 以下命令中lambda表达式为解决问题关键
img_paths = sorted(img_list, key=lambda x: (len(x), x), reverse=False)

print('img_paths:', img_paths)

此次的输出结果如下:

D:\anaconda3\envs\csdn\python.exe C:\Users\zephy\Documents\Python\CSDN\demo_20240702.py
img_paths:
[‘0_100_A.jpg’,
‘0_100_B.jpg’,
‘0_200_A.jpg’,
‘0_200_B.jpg’,
‘0_300_A.jpg’,
‘0_300_B.jpg’,
‘0_800_A.jpg’,
‘0_800_B.jpg’,
‘0_900_A.jpg’,
‘0_900_B.jpg’,
‘0_1000_A.jpg’,
‘0_1000_B.jpg’,
‘0_1100_A.jpg’,
‘0_1100_B.jpg’,
‘0_1200_A.jpg’,
‘0_1200_B.jpg’,
‘0_2000_A.jpg’,
‘0_2000_B.jpg’,
‘0_2100_B.jpg’,
‘0_3000_A.jpg’,
‘0_3000_B.jpg’,
‘0_4000_A.jpg’,
‘0_4000_B.jpg’,
‘0_2100_A .jpg’,
‘0_90000_A.jpg’,
‘0_90000_B.jpg’,
‘0_100000_A.jpg’,
‘0_100000_B.jpg’]
Process finished with exit code 0

在这里插入图片描述
此时可以看到,输出的文件名称与我们所期望的(window文件夹中打开时默认的排序)保持了一致。

下面还可以通过设置,实现需求数据的筛选,详细代码如下:

from tkinter import filedialog
import os

# 打开文件夹
folder_path = filedialog.askdirectory(title='Open the folder')
img_list = os.listdir(folder_path)
# print('img_list:', img_list)

filter_str = '_A.jpg'

img_names = []
img_paths = sorted(img_list, key=lambda x: (len(os.path.basename(x)),os.path.basename(x)), reverse=False)
# print('img_paths:', img_paths)

for i in range(len(img_paths)):
    if img_paths[i].find(filter_str) != -1:
        img_names.append(img_paths[i])

img_names = [os.path.join(folder_path, img_names[i]) for i in range(len(img_names))]
print('img_names:', img_names)

具体结果如下:

D:\anaconda3\envs\csdn\python.exe
C:\Users\zephy\Documents\Python\CSDN\demo_20240702.py img_names: [
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_100_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_200_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_300_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_800_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_900_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_1000_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_1100_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_1200_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_2000_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_3000_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_4000_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_90000_A.jpg’,
‘C:/Users/zephy/Desktop/CSDN/datasets/test\0_100000_A.jpg’] Process
finished with exit code 0

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887889.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop-08-HDFS集群 基础知识 命令行上机实操 hadoop fs 分布式文件系统 读写原理 读流程与写流程 基本语法上传下载拷贝移动文件

章节内容 上一节完成: HDFS的简介内容HDFS基础原理HDFS读文件流程HDFS写文件流程 背景介绍 这里是三台公网云服务器,每台 2C4G,搭建一个Hadoop的学习环境,供我学习。 之前已经在 VM 虚拟机上搭建过一次,但是没留下…

从零开始学量化~Ptrade使用教程——安装与登录

PTrade交易系统是一款高净值和机构投资者专业投资软件,为用户提供普通交易、篮子交易、日内回转交易、算法交易、量化投研/回测/实盘等各种交易工具,满足用户的各种交易需求和交易场景,帮助用户提高交易效率。 运行环境及安装 操作系统&…

OFDM技术概述8——FBMC

Filter bank multicarrier(FBMC,滤波器组多载波),是一种类似于OFDM的调制方式,用滤波器抑制子载波的旁瓣大小,使用FFT/IFFT或多相滤波器实现,其应用于5G的主要优势: 子载波信号带限,带外泄漏小…

5.(vue3.x+vite)水平垂直居中实现方式

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 介绍 (1)父级元素设置position:relative; 子级元素设置:position:absolute;left:50%;top:50%;transform: translate(-50%,-50%); 兼容性较好 (1)父级元素设置弹性盒子:display:flex;justify-content:center; a…

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪,通过LabVIEW编程实现自动控制和数据处理,提供了成本效益高、操作简便的解决方案,有效替代了昂贵的专用仪器,提高了测试效率和设…

library source does not match the bytecode for class SpringApplication

library source does not match the bytecode for class SpringApplication 问题描述:springboot源码点进去然后download source后提示标题内容。spring版本5.2.8.RELEASE,springboot版本2.7.18 解决方法:把spring版本改为与boot版本对应的6.…

如何快速去除视频里面的水印字幕等信息?(内附工具)

环境: VSR 需要独显 GPU:N 4070TI 12G 问题描述: 如何快速去除视频里面的水印字幕等信息? 解决方案: 1.打开AI工具VSR,打了要处理的视频 2.右侧滑块调整绿色选框,选中要去的字幕或者水印 这次测试右…

维克日记 v0.4.2:开发者友好的数字化笔记工具

维克日记,专为技术开发者和笔记爱好者设计的数字化笔记工具,以其强大的功能和灵活的配置赢得了用户的好评。软件采用Markdown语法,提供实时预览功能,让您的笔记编辑更加高效和直观。维克日记的用户界面简洁而功能齐全,…

k8s 中间件

1. zookeeper 是的,Zookeeper 和 Kafka 经常一起使用,Zookeeper 在 Kafka 中扮演了关键角色。以下是 Zookeeper 和 Kafka 在实际项目中的结合使用及其作用的详细说明。 项目背景 假设我们有一个分布式数据处理系统,该系统需要高吞吐量的实…

Webpack: 剖析插件基本形态与架构逻辑

概述 Webpack 对外提供了 Loader 与 Plugin 两种扩展方式,其中 Loader 职责比较单一,开发方法比较简单容易理解;Plugin 则功能强大,借助 Webpack 数量庞大的 Hook,我们几乎能改写 Webpack 所有特性,但也伴…

改变图像中特定区域的颜色

背景与原理 再训练施工即系模型中,发现大量施工机械都是黄色的,我需要把它们换成蓝色的,以增强模型使用可靠性。 目前没有尝试深度学习算法,只是简单的进行了处理。 核心目的:通过人工标注与opencv的结合&#xff0…

Cybervadis认证是什么?

Cybervadis认证是一种全面且深入的网络安全评估和认证服务,旨在帮助组织提高其网络安全实践的成熟度,并有效应对不断变化的网络威胁和攻击。以下是关于Cybervadis认证的一些关键信息: 认证目的: 评估和验证组织在网络安全方面的能…

使用目标检测模型YOLO V10 OBB进行旋转目标的检测:训练自己的数据集(基于卫星和无人机的农业大棚数据集)

这个是在YOLO V10源码的基础上实现的。我只是在源码的基础上做了些许的改动。 YOLO V10源码:YOLO V10源码 YOLOv10是清华大学的研究人员在Ultralytics Python包的基础上,引入了一种新的实时目标检测方法,解决了YOLO 以前版本在后处理和模型架…

计组_虚拟存储器

2024.06.09:计算机组成原理学习笔记 第11节 虚拟存储器* 1.1 分页思想1.1.1 虚拟地址/逻辑地址1.1.2 主存地址/物理地址1.1.3 页表1.1.4 分页方式的缺陷 1.2 分段思想1.2.1 虚拟地址/逻辑地址1.2.2 主存地址/物理地址1.2.3 段表 1.3 段页式思想1.3.1 虚拟地址/逻辑地…

分布式技术专题 | TCP在分布式网络中的通信机制与底层实现

深入解析分布式网络中的TCP通信协议实现 跨地域通信与资源共享网络节点与主机的定义网络技术通信机制TCP/IP协议模型TCP/IP分层机制TCP的Socket链接处理控制TCP的优势和特性自动差错控制正确性和有序性 TCP的Socket使用端口在应用程序间通信TCP的Socket使用端口套接字操作 跨地…

5G(NR) NTN 卫星组网架构

5G(NR) NTN 卫星组网架构 参考 3GPP TR 38.821 5G NTN 技术适用于高轨、低轨等多种星座部署场景,是实现星地网络融合发展的可行技术路线。5G NTN 网络分为用户段、空间段和地面段三部分。其中用户段由各种用户终端组成,包括手持、便携站、嵌入式终端、车…

鸿蒙应用开发-时间屏幕

点击下载源码: https://download.csdn.net/download/liuhaikang/89509449 做一个时间屏幕,可以点击切换白色和黑色,有渐变效果,使用到了鸿蒙的动画效果。 在这个设计中,我们首先引入了通用能力包,以实现功…

uniapp做小程序内打开地图展示位置信息

使用场景&#xff1a;项目中需要通过位置信息打开地图查看当前位置信息在地图那个位置&#xff0c;每个酒店有自己的经纬度和详细地址&#xff0c;点击地图按钮打开内置地图如图 方法如下&#xff1a; <view class"dttu" click"openMap(info.locationY,info.…

24/07/02数据结构(1.1201)算法效率顺序表

数据结构基本内容:1.时间复杂度 空间复杂度2.顺序表链表3.栈 队列4.二叉树5.排序 数据结构是存储,组织数据的方式.指相互之间存在一种或多种特定关系的数据元素的集合 算法是定义良好的计算过程.取一个或一组值为输入并产生一个或一组值为输出. 需要知道虽然选择题有20-30个…

什么是Java泛型擦除?

JDK1.5之后引入泛型擦除的概念。 目录 验证逻辑 实际编译后的结果&#xff1a; 验证例子&#xff1a; 两个类型相同&#xff0c;表面泛型都被擦出了&#xff0c;都是Arraylist。 List<String> list1 new Arraylist<>(); List<Integer> list2 new Arrayli…