当前位置: 首页 > article >正文

python脚本处理---(不同文件夹中的文件对比、移动,提取指定类型文件、中文文件名转英文)

一、对比两个文件夹的文件差异并导出差异

# -*-coding:utf-8-*-    
  
#===============================================================================  
# 目录对比工具(包含子目录 ),并列出
# 1、A比B多了哪些文件  
# 2、B比A多了哪些文件  
# 3、二者相同的文件: md5比较
#===============================================================================  
  
import os
import time
import difflib
import hashlib
import shutil
 
 
def getFileMd5(filename):
    if not os.path.isfile(filename):
        print('file not exist: ' + filename)
        return
    # 哈希算法(加密算法)
    # 通过hashlib 来生成文件的MD5值。MD5(Message Digest Algorithm 5)是一种广泛使用的哈希函数,它生成一个128位的哈希值(32个字符的十六进制数)。
    # 通过计算文件的MD5值,可以验证文件的一致性和完整性,常用于文件校验和安全领域。
    myhash = hashlib.md5()
    f = open(filename,'rb')
    while True:
        b = f.read(8096)
        if not b :
            break
        myhash.update(b)
    f.close()
    return myhash.hexdigest()
 
 
def getAllFiles(path):
    flist=[]
    for root, dirs , fs in os.walk(path):
        for f in fs:
            f_fullpath = os.path.join(root, f)
            f_relativepath = f_fullpath[len(path):]
            flist.append(f_relativepath)
    return flist
 
def dirCompare(comparePath,targetPath):
    afiles = getAllFiles(comparePath)
    bfiles = getAllFiles(targetPath)
 
    setA = set(afiles)
    setB = set(bfiles)
 
    commonfiles = setA & setB  # 处理共有文件
 
    for of in sorted(commonfiles):
        amd=getFileMd5(comparePath+'\\'+of)
        bmd=getFileMd5(comparePath+'\\'+of)
        if amd != bmd:  
            if not os.path.exists(os.path.dirname(os.getcwd() + of)):
                os.makedirs(os.path.dirname(os.getcwd() + of))
            # 将文件保存在执行此脚本的目录...
            shutil.copyfile(targetPath + of, os.getcwd() + of)
 
    # 处理仅出现在一个目录中的文件
    onlyFiles = setA ^ setB
    onlyInA = []
    onlyInB = []
    for of in onlyFiles:
        if of in afiles:
            onlyInA.append(of)
        elif of in bfiles:
            onlyInB.append(of)
            
    if len(onlyInA) > 0:
        print ('-' * 20,"only in ", comparePath, '-' * 20)
        for of in sorted(onlyInA):
            print (of)
            # 不保存comparePath多出来的文件...
            
    if len(onlyInB) > 0:
        print ('-' * 20,"only in ", targetPath, '-' * 20)
        for of in sorted(onlyInB):
            print (of)
            if not os.path.exists(os.path.dirname(os.getcwd() + of)):
                os.makedirs(os.path.dirname(os.getcwd() + of))
            # 将文件保存在执行此脚本的目录...
            shutil.copyfile(targetPath + of, os.getcwd() + of)
            
if __name__ == '__main__':
    comparePath = 'E:\\multyfs2single\\FS-old-服务器\\SegmentationClass' #对比文件夹
    targetPath = 'E:\\multyfs2single\\FS-old-\\VOC2007\\SegmentationClass' #参考文件夹
    savePath = 'E:\\multyfs2single\\FS-old-服务器\\add' #保存文件夹,在这里我没保存到savePath,大家如果需要保存,可以把脚本中的os.getcwd()替换为savePath
    dirCompare(comparePath, targetPath)
    print("\ndone!")

二、从一个目录内提取另一个目录的同名文件,并转移

假如A目录中为jpg文件,B目录中为txt文件,我们需要从A中挑选出与B中同名(不同后缀)的文件,并保存到新的文件夹中。

import shutil
import os

def main():
	# 提取名称的目标,我们目前是txt格式
    path_label = 'E:/multyfs2single/FS-old-服务器/add'
    # 大目录,需要从里面挑出来同名的文件
    path_object = 'E:/multyfs2single/FS-old-/VOC2007/JPEGImages'
    type_object = 'jpg'
    # 备份到的输出路径
    path_output = 'E:/multyfs2single/FS-old-服务器/jpg'

    for i in os.walk(path_label):
        for j in i[2]:
            p_label = os.path.join(path_label, j)
            # 注意,默认label内是txt文件,长度为3,可以根据自己情况修改
            obj_name = j[:-3]+type_object
            # 挑选出来的同名文件路径
            obj_path = os.path.join(path_object, obj_name)
            # 若找到同名的jpg文件,则拷贝出来
            if os.path.exists(obj_path) == True:
                new_path = os.path.join(path_output, obj_name)
                shutil.copyfile(obj_path,new_path)

if __name__ == '__main__':
    main()

三、提取路径下所有指定后缀文件到指定文件夹下 ,以.txt为例

import shutil
import os
def move_txt_files(source, dest):
    for root, dirs, files in os.walk(source):
        for file in files:
            if file.endswith('.txt'):
                source_path = os.path.join(root, file)
                destination_path = os.path.join(dest, file)
                shutil.move(source_path, destination_path)
# 请填写要移动的源文件夹和目标文件夹的路径
source_folder = "src_folder"
destination_folder = "dst_folder"
if not os.path.exists(destination_folder):
    os.makedirs(destination_folder)
move_txt_files(source_folder, destination_folder)

四、批量中文文件名转英文
1、需要安装xpinyin
pip install xpinyin
2、执行如下代码:

python change_name.py folder_dir

change_name.py:

from xpinyin import Pinyin
import os
import sys
import pdb

PREFIX_NAME = ''

def list_all(dir_name):
    pinyin_converter = Pinyin()
    for dirpath, dirnames, filenames in os.walk(dir_name):
        for filename in filenames:
            res = pinyin_converter.get_pinyin(filename, '_')
      #      res = remove_chars(res, '-', '(', ')', '(', ')')  文件名中去掉了'-'
            res = remove_chars(res, '(', ')', '(', ')')
            res = res.replace(' ', '_')
            res = res.lower()
            if PREFIX_NAME != '':
                res = PREFIX_NAME + res
            if res[-5] == '_':
                res = res[:-5] + res[-4:]
            src_path = dirpath + '\\' + filename
            dest_path = dirpath + '\\' + res
            print(src_path + '->' + res)
            os.rename(src_path, dest_path)


def remove_chars(filename, *chars):
    for i in range(len(chars)):
        filename = filename.replace(chars[i], '')
    return filename

# arg1 dir
# arg2 prefix name default empty string

if __name__ == '__main__':
    print(sys.argv)
    print('len(sys.argv):',len(sys.argv))
    if len(sys.argv) == 1:
        print('must has name dir')
        exit(-1)
    if len(sys.argv) >= 3:
        PREFIX_NAME = sys.argv[3]
    for dir_name in sys.argv[1:]:
        list_all(dir_name)

http://www.kler.cn/a/287347.html

相关文章:

  • 【FAQ】HarmonyOS SDK 闭源开放能力 —Share Kit
  • 解决Spring Boot整合Redis时的连接问题
  • 计算机网络-理论部分(二):应用层
  • LeetCode 2816.翻倍以链表形式表示的数字
  • 第二十一周学习周报
  • 华为HCIP——MSTP/RSTP与STP的兼容性
  • 年化从19.1%提升到22.5%,全球大类资产轮动,加上RSRS择时,RSRS性能优化70倍。(附策略源码)
  • 如何选到好的宠物空气净化器?有没有推荐的品牌?
  • Javascript实现笛卡儿积算法
  • CSS 高级区块效果——WEB开发系列25
  • 免费的电脑录屏软件,这几款软件满足录屏需求!
  • visual studio code默认打开文档的编码格式simplified chiness(GBK) gbk
  • 基于FFMPEG读取摄像头图像编码为h264
  • 【Datawhale X 李宏毅苹果书 AI夏令营】《深度学习详解》Task2 打卡
  • 【Web开发工具】基于Windows系统下的WebStorm安装教程
  • 告警管理大师:深入解析Alertmanager的配置与实战应用
  • esp32 中断最简验证程序
  • css的“id选择器“命名问题
  • pytest自动化测试执行环境切换的两种解决方案
  • 深度学习系列74:语音中的mel谱
  • 通用文字识别API如何通过Java进行调用?(一)
  • Python知识点:如何使用Appium进行移动应用测试
  • Linux基础(包括centos7安装、linux基础命令、vi编辑器)
  • three.js 开发粒子系统
  • RCU概念
  • 【QNX+Android虚拟化方案】101 - Android GVM 虚拟网络 Virt-Net 配置