Python | 统计每个文件夹各类图片个数

1 背景

现在已经通过爬虫将所有商家首页的图片下载ok,但给导师汇报总的有个基本的结论吧,也就是说,多少文件夹没有图片,分为big和rec,两者任一为空有多少?均为空多少?平均每个文件夹有多少图片?这就需要去统计一波了!

2 整体思路

  • 通过循环遍历每一个文件夹
  • 获取一个文件夹下面所有文件的名称,然后如果出现rec或者big分别进行计数,所以一开始定义为0
  • 每一个循环形成一个DataFrame 放到list 最后进行一个concat 大功告成

3 读入所有文件夹

import os
all_folds = os.listdir('702个美团商户上传图片/')
all_folds = [x for x in all_folds if '.' not in x]
print(len(all_folds))
all_folds[:5]
702

['150569726', '163443323', '177474079', '68654281', '178086221']

4 读每个文件夹下面图片

import pandas as pd
import time

data_need = []
t0 = time.time()

for i in range(len(all_folds)):
# for i in range(0,5):
    print('正在统计第 %d 个文件夹' % (i+1))
    # 定位每一个文件夹
    path = all_folds[i]
    # 遍历文件夹所有文件内容
    all_files = os.listdir(path)
    # 计数-big/rec
    big_num = 0
    rec_num = 0
    for j in all_files:
        if 'big' in j:
            big_num += 1
        elif 'rec' in j:
            rec_num += 1
        else:
            pass
    # 构建数据框
#     print(big_num)
#     print(rec_num)
    y = pd.DataFrame({'mer_id': all_folds[i],
                      'big_num': [big_num],
                      'rec_num': [rec_num]})
    # 加到全局的list里面
    data_need.append(y)

# 合并数据
data_final = pd.concat(data_need, axis=0)
t1= time.time()
print('所有文件夹统计完毕,花费时间为 %.2f s' % (t1 - t0))        
正在统计第 1 个文件夹
正在统计第 2 个文件夹
正在统计第 3 个文件夹
正在统计第 4 个文件夹
正在统计第 5 个文件夹
......
正在统计第 698 个文件夹
正在统计第 699 个文件夹
正在统计第 700 个文件夹
正在统计第 701 个文件夹
正在统计第 702 个文件夹
所有文件夹统计完毕,花费时间为 0.62 s
data_final.index = range(len(data_final))
print(data_final.shape)
data_final.head()
(702, 3)
mer_idbig_numrec_num
015056972656
116344332326
217747407956
36865428120
417808622104
data_final.head(10)
mer_idbig_numrec_num
015056972656
116344332326
217747407956
36865428120
417808622104
59546333000
65033347100
7498418220
818259614110
9443830436

4.1 判断空文件夹有多少个

思路:

  • 使用map函数(配合使用lambda匿名函数),先定义一个函数(如果两项为0 则返回0)
def f(x,y):
    if x == y == 0:
        return 0
    else:
        return 1
data_final['count_0_0'] = data_final.index.map(lambda x: f(data_final['big_num'][x], data_final['rec_num'][x]))
data_final.head(10)
mer_idbig_numrec_numcount_0_0
0150569726561
1163443323261
2177474079561
368654281201
4178086221041
595463330000
650333471000
74984182201
8182596141101
94438304361
df_0_0 = data_final[data_final['count_0_0']==0]
print(df_0_0.shape) # 即140个双空!
(140, 4)

5 看每个文件夹平均有多少张图片

data_final['total'] = data_final['big_num'] + data_final['rec_num']
data_final['total'].describe()
count    702.000000
mean       6.200855
std        4.306827
min        0.000000
25%        2.000000
50%        8.000000
75%       11.000000
max       11.000000
Name: total, dtype: float64

6 数据筛选

6.1 筛选出big_num为0的 然后去检查一下

big_0 = data_final[data_final['big_num'] == 0]
print(big_0.shape)
big_0.head()
(176, 5)
mer_idbig_numrec_numcount_0_0total
41780862210414
5954633300000
6503334710000
101791789890000
151540486920000

6.2 筛选出rec_num为0的 然后去检查一下

rec_0 = data_final[data_final['rec_num'] == 0]
print(rec_0.shape)
rec_0.head()
(226, 5)
mer_idbig_numrec_numcount_0_0total
3686542812012
5954633300000
6503334710000
749841822012
81825961411011

检查思路:

  • 通过将上述id与原有数据匹配,selenium到每一个网址,肉眼判断是否有漏的!

7 结论

数据概况:

  • 总共有702个文件夹,即有702个商户。
  • 有176个商户没有大图
  • 有226个商户没有推荐菜
  • 有140个商户没有大图也没有推荐菜
  • 平均每个文件夹有6张图片,一个文件夹下图片最多的有11张!
你可以使用 Vue.js 的 axios 库和 Node.js 的 fs 模块来实现获取一个文件夹图片个数。 以下是一个简单的实现方式: 1. 在 Vue.js 的组件,使用 axios 发送一个 GET 请求到后端,请求获取某个文件夹图片列表。 2. 在后端,使用 Node.js 的 fs 模块读取该文件夹下的所有文件,筛选出图片类型的文件(例如 .jpg、.png 等),并返回图片列表给前端。 3. 在前端,通过获取到的图片列表,统计图片数量即可。 以下是一个简单的示例代码: ``` // 前端代码 <template> <div> <p>图片个数:{{ imageCount }}</p> </div> </template> <script> import axios from 'axios'; export default { data() { return { imageCount: 0, }; }, mounted() { axios.get('/api/getImageList') .then(response => { // 统计图片个数 this.imageCount = response.data.filter(file => /\.(jpg|png|jpeg)$/.test(file)).length; }) .catch(error => { console.error(error); }); }, }; </script> // 后端代码 const express = require('express'); const fs = require('fs'); const path = require('path'); const app = express(); // 获取指定文件夹下的所有文件 function getAllFiles(dirPath, arrayOfFiles) { const files = fs.readdirSync(dirPath); arrayOfFiles = arrayOfFiles || []; files.forEach(file => { if (fs.statSync(dirPath + "/" + file).isDirectory()) { arrayOfFiles = getAllFiles(dirPath + "/" + file, arrayOfFiles); } else { arrayOfFiles.push(path.join(dirPath, "/", file)); } }); return arrayOfFiles; } app.get('/api/getImageList', (req, res) => { const dirPath = '/path/to/image/folder'; // 修改为你需要获取的文件夹路径 const files = getAllFiles(dirPath); res.send(files); }); app.listen(3000, () => { console.log('Server started on port 3000'); }); ``` 请注意,上述代码仅供参考,实际应用可能需要根据具体情况进行修改和完善。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值