杂乱文件自动分类
在数据清理或者实证过程中,常常会有大量的文档、表格和图片等。疏于整理的话,文件夹中文件就会五花八门。下图是不是太过真实?
如果想将文件分类整理,你会怎么做呢?Ctrl+X
和 Ctrl+V
?听起来好费眼睛啊。有没有什么酷一点的方式?Talk is cheap, show me your code
。本文先使用 Stata 和 Python 写代码来处理,然后推荐一款 Windows 系统的文件管理神器 DropIt 。
分析问题
在动手写代码之前,先来分析一下这个问题:后缀是识别文件类别的重要标志。所以,可以使用后缀作为分类依据。如果以该文件后缀命名的文件夹存在,则移动进去;如果不存在,先新建该文件后缀的文件夹,再将文件移动进去。实现思路可以用如下流程图描述:
实现过程
Stata 实现
使用 Stata 的思路是通过两次遍历。首先遍历文件名,提取后缀,创建文件夹;之后再通过文件后缀判断,将文件移动到相应的文件夹。实现代码如下:
cd "..files"
* Create Folders
fs
foreach file in `r(files)'{
local folder = ustrregexrf("`file'","^.*.","",.)
cap mkdir "`folder'"
}
* Move Files
fs
foreach file in `r(files)'{
local type = ustrregexrf("`file'","^.*.","",.)
if ustrregexrf("`file'","^.*.","",.) == "`type'"{
!move "`file'" "`type'"
}
}
Python 实现
之前在 鱼哥的文章 里面看到过类似需求的实现思路:使用 os
库读取后缀、判断文件夹是否存在,使用 shutil
库来操作文件。实现代码如下:
import os
import shutil
os.getcwd()
os.listdir()
os.chdir("../files")
for f in files:
folder = f.split('.')[-1]
if not os.path.exists(folder):
os.mkdir(folder)
shutil.move(f, folder)
else:
shutil.move(f, folder)
实现效果
以 Stata 运行过程为例,看看实现效果。怎么样?是不是看起来还比较“酷炫”?
DropIt:文件自动分类管理工具
DropIt 是一款源于国外的开源、免费软件,似乎仅支持 Window 系统。预先设定好协议(规则),轻松拖拽就可以将文件自动分类。可前往 DropIt 官网[1] 下载体验,软件非常轻量,安装包只有 5.1 M 。我们来看看处理任务的效果:
除了能自动分类外,它还支持批量压缩文件、给重要的文件加密、文件转格式和批量处理图片等功能。根据使用习惯,可以打造个人全自动的文件管理系统。
小结
本文围绕杂乱文件自动分类的问题,分别使用 Stata 和 Python 编写代码来实现需求,然后推荐一款 Windows 系统的文件管理神器。通过这篇文章,是不是感觉在日益依赖电脑的学习和办公环境下,能够写点代码实现需求,可以节约时间和提高效率。再者,“工欲善其事,必先利其器”,多关注和使用一些良心的神器,也会极大的提高工作效率。
公众号后台聊天窗口回复【分类】获取本文演示数据、代码和 DropIt 安装程序。
参考资料
[1]
DropIt 官网: http://www.dropitproject.com/
[2]
Crash Course: How to start with DropIt: http://www.dropitproject.com/dokuwiki/doku.php?id=howto:start_with_dropit
[3]
用 DropIt 打造全自动的 Windows 文件管理体系: https://sspai.com/post/45532
- webvirtmgr-重命名kvm虚拟机的名称
- Lucene 2.0最基本的入门代码
- 网站每日PV/IP统计/总带宽/URL统计脚本分享(依据网站访问日志)
- 查看服务器系统资源(cpu,内容)利用率前几位的进程的方法
- 腾讯云平台部总经理陈磊:大数据背后的技术支撑
- DataSet与Xml相互转化
- SqlTransaction事务使用示例
- nginx的web缓存服务环境部署记录
- nginx反向代理+缓存开启+url重写+负载均衡(带健康探测)的部署记录
- [转自blueidea]像table一样布局div Ⅰ
- 如何对动态创建控件进行验证以及在Ajax环境中的使用
- 升级个人网站框架组件IBatisNet+Castle
- 如何在多线程中调用winform窗体控件
- gerrit代码简单备份方案分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- AkShare-重要机构-伦敦金属交易所
- 为什么不推荐使用BeanUtils属性转换工具
- 从源码打造云原生时代的「Linux」——Kubernetes
- Django-models & QuerySet API
- [奇淫巧技]GitHub个人页的新玩法
- 一致性哈希的分析与实现
- 关系型数据库查询语言 SQL 和图数据库查询语言 nGQL 对比
- 目标检测之评价指标 - mAP
- sass的基础用法
- Golang Gin 实战(十四)| 文件托管、反向代理百度网站、自实现API网关
- ceph修复pg inconsistent
- 基于kubernetes的kong网关实战
- 移动端适配必须掌握的基本概念和适配方案
- [OHIF-Viewers]医疗数字阅片-医学影像-Redux中的reducer到底是什么,以及它为什么叫reducer?
- 【从零开始用Swift开发一个iOS应用(仿微博)】开篇-1. demo上手体验