Python批量获取文件信息

2020-07-01 15:13:00 浏览数 (1)

看视频时打开视频才能看到视频的播放时长,但是每个视频都打开又太繁琐了,能不能用python来获取这一信息呢?答案是肯定的,就是过程有些周折。

获取文件下所有文件

使用os.listdir获取文件目录下所有文件

代码语言:javascript复制
import os

path = r'D:temp20200626' 
fileList = os.listdir(path)

获取文件大小

使用os.stat()中的 st_size 属性获取文件大小

代码语言:javascript复制
filesizelist = []
for f in fileList:
    filesize = round(os.stat(path  '\'  f).st_size/float(1024*1024),2)  
    # st_size 默认单位是字节,换算成 MB
    filesizelist.append(filesize)

获取视频文件播放时长

仔细观察发现,一个视频源的文件,其文件大小和视频播放时长是成正比的,这里的比例大致为3/1

使用pandas写入文件

代码语言:javascript复制
import pandas as pd

df = pd.DataFrame(list(zip(fileList,filesizelist)))
# 修改列名
df.columns = ['fileName','fileSize(MB)']
# 添加文件播放时长列
df['fileDuration(H)'] = round(df['fileSize(MB)'] / 3, 2)
# 添加文件目录
df['filePath'] = path
print(df)

                  fileName  fileSize(MB)  fileDuration(H)          filePath
0  2018.03.09-20.22.42.mp4          0.44             0.15  D:temp20200626
1  2018.03.21-21.39.28.mp4          0.60             0.20  D:temp20200626
2  2018.03.21-21.40.12.mp4          0.51             0.17  D:temp20200626
3  2018.04.08-14.32.36.mp4          1.16             0.39  D:temp20200626
4  2018.04.08-14.58.16.mp4          5.82             1.94  D:temp20200626

写入当前目录

代码语言:javascript复制
df.to_csv(path  r'filesize.csv', encoding='gbk')

写入当前目录代码比较简单,但是第二次运行程序时就会识别到第一次写入的这个文件,类似这样

代码语言:javascript复制
                  fileName  fileSize(MB)  fileDuration(H)          filePath
0  2018.03.09-20.22.42.mp4          0.44             0.15  D:temp20200626
1  2018.03.21-21.39.28.mp4          0.60             0.20  D:temp20200626
2  2018.03.21-21.40.12.mp4          0.51             0.17  D:temp20200626
3  2018.04.08-14.32.36.mp4          1.16             0.39  D:temp20200626
4  2018.04.08-14.58.16.mp4          5.82             1.94  D:temp20200626
5             filesize.csv          0.00             0.00  D:temp20200626

很显然,这不是我想要的结果,我想到了两个方法来处理这个问题

方法1:写入上级目录

文件管理系统中..表示上级目录,使用如下代码便可以规避上边的问题

代码语言:javascript复制
df.to_csv(path  r'..filesize.csv', encoding='gbk')

方法2:过滤视频文件

由于写入的文件是csv格式,程序在开始处理时,只处理视频文件即可,代码改写如下:

代码语言:javascript复制
path = r'D:temp20200626' 
fileList = os.listdir(path)
videoList = []
for f in fileList:
    if os.path.splitext(path  '\'  f)[1] in ('.mp4','wmv','swf','avi'):
        videoList.append(f)
filesizelist = []
for f in videoList:
    filesize = round(os.stat(path  '\'  f).st_size/float(1024*1024),2)  
    # st_size 默认单位是字节,换算成 MB
    filesizelist.append(filesize)

完整代码

代码语言:javascript复制
import os
import pandas as pd

path = r'D:temp20200626' 
fileList = os.listdir(path)
videoList = []
for f in fileList:
    if os.path.splitext(path  '\'  f)[1] in ('.mp4','wmv','swf','avi'):
        videoList.append(f)
filesizelist = []
for f in videoList:
    filesize = round(os.stat(path  '\'  f).st_size/float(1024*1024),2)  
    # st_size 默认单位是字节,换算成 MB
    filesizelist.append(filesize)

df = pd.DataFrame(list(zip(videoList,filesizelist)))
df.columns = ['fileName','fileSize(MB)']
df['fileDuration(H)'] = round(df['fileSize(MB)'] / 3, 2)
df['filePath'] = path
print(df)
# # 写入当前目录
# df.to_csv(path  r'filesize.csv', encoding='gbk')
# 写入上级目录
df.to_csv(path  r'..filesize.csv', encoding='gbk')

-- END --

0 人点赞