python 按文件名顺序 将图片转为视频

本文介绍了一种解决从图片序列生成视频时出现闪烁问题的方法。通过对图片文件名进行正确排序,确保了视频播放的连贯性和流畅性。文中提供了一个Python脚本示例,演示了如何读取特定格式命名的图片文件并将其转换为视频。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

主要参考下面的链接,然后针对自己的数据集进行了修改
解决了图片转视频中闪烁的问题
(因为图片的名称顺序是1 10 而不是1 2 3 ,导致的视频不连续)
Python——图片与视频互转(亲测有效)

# 文件名的格式是Img_1.jpg   Img_100.jpg  之类的
img_array = []
filepath = r'xxxx'
filenames = os.listdir(filepath)
filenameNum = len(filenames)
for i in range(0,filenameNum):
    filename = filepath + '/' + 'Img_' + str(i) +'.jpg' #png也是可以的
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width, height)
    img_array.append(img)
    print(filename)

# avi:视频类型,mp4也可以
# cv2.VideoWriter_fourcc(*'DIVX'):编码格式
# 25:视频帧率
# size:视频中图片大小
out = cv2.VideoWriter('xxx.avi',
                      cv2.VideoWriter_fourcc(*'DIVX'),
                      25, size)

for i in range(len(img_array)):
    out.write(img_array[i])
out.release()

<think>嗯,用户想知道怎么用Python的glob模块按文件名排序。首先,我得回忆一下glob.glob函数的基本用法。记得glob.glob返回的文件列表是按照操作系统返回的顺序,可能不是按数字或字母顺序排列的。比如,在Linux系统中,返回的顺序可能是不确定的,而Windows可能是按字母顺序?或者可能根据文件系统的不同而不同。所以用户需要自己排序。 用户提到的问题可能出现在文件名中包含数字的情况,比如file1.txt, file2.txt一直到file10.txt。如果直接用sorted()函数,字符串排序会把file10排在file2前面,因为字符串比较是逐个字符的,1在ASCII里比2小。这时候需要自然排序,也就是按照数字的值来排序,而不是按字符顺序。 这时候应该如何处理呢?可能需要从文件名中提取数字部分,然后转换成整数进行排序。比如,用正则表达式找到文件名中的数字,作为排序的键。例如,对于文件名file3.txt,提取出3,然后按这个数值排序。 另外,用户提供的引用中提到了几种方法。比如引用[2]中使用了os.path.getmtime按修改时间排序,或者按大小排序。但用户的问题是按文件名排序,特别是包含数字的情况。所以应该关注如何从文件名中提取数字进行自然排序。 引用[3]中的例子显示用户尝试用切片的方式提取数字,但这种方法可能不够灵活,尤其是当文件名中的数字位置不固定时。这时候可能需要更通用的方法,比如正则表达式。例如,使用re.findall来查找所有连续的数字,然后转换成整数作为排序的key。 所以,可能的解决方法是:使用sorted函数,结合自定义的key函数,该函数从文件名中提取数字部分,并转换为整数。例如: sorted_files = sorted(glob.glob('*.txt'), key=lambda x: int(re.findall(r'\d+', x)[0])) 但需要考虑文件名中可能没有数字的情况,这时候可能需要处理异常,或者使用默认值。不过根据用户的问题,假设文件名中都有数字部分需要排序。 此外,如果文件名中有多个数字部分,比如file_1_2.txt,可能需要决定用哪部分数字排序。这时候可能需要更复杂的提取逻辑,或者根据具体需求调整正则表达式。 总结步骤应该是: 1. 使用glob.glob获取文件列表。 2. 使用sorted函数,并自定义key来提取文件名中的数字部分。 3. 处理可能的异常情况,比如没有数字的情况,或者数字位置不固定。 另外,用户提供的引用[3]中有一个例子,通过切片的方式提取数字,并补零来保证排序正确。这可能适用于文件名结构固定的情况,比如文件名中数字的位置固定,并且长度固定。比如文件名类似file01.txt,file02.txt等。如果用户文件名中的数字位数不一致,可能需要先补零,或者提取数字后按数值排序。 所以,最终的解决方案可能需要根据用户的具体文件名结构来调整。但一般情况下,使用正则表达式提取数字作为排序键是比较通用的方法。 另外,可能还需要考虑混合字母和数字的情况,比如file1a.txt和file10b.txt,这时候需要更复杂的解析,但用户的问题可能集中在纯数字的情况。 综上,回答应该包括以下几点: - 默认情况下glob.glob返回的顺序不可靠,需手动排序。 - 使用sorted函数,结合lambda表达式和正则表达式提取数字进行自然排序。 - 示例代码演示如何按文件名中的数字排序。 - 其他可能的排序方式,比如按修改时间、大小等(引用中的内容)。</think>在Python中,使用`glob.glob`获取文件列表后,默认的排序可能不符合预期。以下是针对文件名排序的解决方案: ### 一、基础排序方法 1. **按字母顺序排序** ```python import glob files = sorted(glob.glob("*.txt")) # 直接对结果排序 ``` 2. **按数字自然排序** 若文件名包含数字(如`file1.txt`, `file2.txt`),需提取数字并转换为整数排序: ```python import re files = sorted(glob.glob("file*.txt"), key=lambda x: int(re.findall(r'\d+', x)[0])) ``` ### 二、复杂文件名处理 若文件名格式不统一(如`img1_10.png`, `img1_2.png`),需自定义排序逻辑: ```python def natural_sort_key(filename): # 同时提取字母和数字部分,如将"img1_10"转为["img", 1, "_", 10] return [int(s) if s.isdigit() else s.lower() for s in re.split(r'(\d+)', filename)] files = sorted(glob.glob("*.png"), key=natural_sort_key) ``` ### 三、其他排序方式 1. **按修改时间排序** ```python import os files = sorted(glob.glob("*.png"), key=os.path.getmtime) # 最近修改在前[^2] ``` 2. **按文件大小排序** ```python files = sorted(glob.glob("*.png"), key=lambda x: os.path.getsize(x)) ``` ### 四、修复不规范的命名 若文件名数字位数不一致(如`file1`, `file10`),可通过补零统一格式[^3]: ```python def rename_files(): for f in glob.glob("file*"): num = re.search(r'\d+', f).group() new_name = f"file_{num.zfill(3)}" # 将1补为001 os.rename(f, new_name) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值