Python办公自动化(1)对文件的操作

一、对本地文件的操作

1. 文件复制

shutil.copy(src, dst)

# src:连接的位置 ; dst:文件的名字

复制文件的内容和一些元数据。将test666.txt复制到test1copy。

import os # 找到本地文件
from shutil import copy # 操作文件
path = os.path.join(os.getcwd(),"test666.txt")
target = os.path.join(os.getcwd(),"test1copy")
copy(path,target) # 参数1:原 ; 参数2:目标

shutil.copyfile(src, dst)

只复制文件的内容(数据)。将test666.txt的内容复制到test1copy目录下的test2.txt中。

# 指向文件
import os
from shutil import copyfile
path = os.path.join(os.getcwd(),"test666.txt")
target_path = os.path.join(os.getcwd(),"test1copy/test2.txt")
copyfile(path,target_path)

2. 文件剪切

shutil.move(src, dst)

将文件从一个位置移动到另一个位置(剪切操作)。

move("test1.txt","test1move/test1move.txt")

3. 删除文件

os.remove(path)

删除指定路径的文件。

os.remove('test1move/test1move.txt')

4. 文件的压缩

shutil.make_archive(base_name, format, root_dir, base_dir)

将目录或文件压缩成归档文件。

参数1:压缩文件名字;参数2:压缩文件类型;参数3/4:压缩文件地址

zipfile = make_archive('test1copyzip','zip',os.path.join(os.getcwd()),'test1copy')

5. 文件的解压缩

shutil.unpack_archive(filename, extract_dir)

解压缩归档文件到指定目录。

target = os.path.join(os.getcwd(),'test2')
unpack_archive("test1copyzip.zip",target)

二、对文件夹的操作 

1.文件夹复制

shutil.copytree(src, dst)

复制整个目录树(包括所有子目录和文件)。

参数1:目标;参数2:复制位置及名字

copytree('test1copy','test2copy')

2.文件夹剪切 

shutil.move(src, dst)

将文件夹从一个位置移动到另一个位置(剪切操作)。

参数1:目标:注意目标不存在会报错;参数2:剪切的位置(到哪里去

move('test2','test1move')

3.文件夹删除

shutil.rmtree(path) 

递归删除整个目录树(包括所有子目录和文件)。

参数:删除的目标

rmtree('test2copy')

三、文件的查找

根据实际需求选择合适的 glob 模式。

import os
from glob import glob
target = os.getcwd()
result = glob(target+"/*") # 获取目录下所有文件
result = glob(target+"/*.py") # 获取目录下所有的扩展名是.py的文件
result = glob(target+"/2-文件夹的操作.py") # 获取目录下指定的文件
result = glob(target+"/test*") # 获取目录下以test开头的文件(模糊查询)
print(result)

四、查找目录中指定的文件

需求:查找指定文件,根据文件名称在多层目录的环境中找到目标文件

已知条件:知道最外层目录地址,要查找的文件名

实现思路:利用glob从最外层目录开始查找,利用递归模式,逐层查找,直到找到目标

注意:由于要找的文件可能存在多个,因此使用列表的方式存放文件地址

import glob
path = glob.os.path.join(glob.os.getcwd(),'*')
final_result=[]
# 构建函数用于查找指定文件,由于需要遍历目录数,因此在该函数中采用递归的方式完成遍历
def search(path,target):
    result = glob.glob(path)
    for data in result:
        if glob.os.path.isdir(data): #isdir()判断是否是文件夹,是则返回true,否则返回false
            # 获得当前文件夹的地址
            _path = glob.os.path.join(data,'*')
            search(_path,target) # 递归方式,陆续向当前文件的内部查找文件
        else:
            if target in data: #判断查找的文件名是否匹配
                final_result.append(data)# 将查找的文件信息存放在最后的结果中
    return final_result # 返回最后的结果
if __name__ == '__main__':
    result = search(path,'test1.txt')
    print(result)

五、查找含有指定内容的文件

需求:对文件中的内容进行匹配查找,包含指定内容则查找出来

已知条件:文件中会包含指定内容,不知道文件的名以及所在目录,只知道最外层根目录

实现思路:利用glob从最外层目录开始查找,利用递归模式,逐层查找,对每一个文件的内容进行匹配

open()函数:

用于打开文件,并对文件的内容进行操作

参数1:文件的位置;参数2:操作文件的方式 r:读取 w:输出;参数3:读取时的字符集设置

import glob
path = glob.os.path.join(glob.os.getcwd(),'*')
final_result=[]
def search(path,target):
    result = glob.glob(path)
    for data in result:
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data,'*')
            search(_path,target)
        else:
            f = open(data,'r',encoding='utf-8')
            # print(data)
            try:
                content = f.read()
                if target in content: # 如果文件的内容包含查询的内容,否则返回true
                    final_result.append(data)
            except:
                print('data read exception:%s' % data)
                continue
            finally:
                f.close()
    return final_result
if __name__ == '__main__':
    result = search(path,target="aaaa")
    print(result)

六、清理重复的文件

需求:去掉目录中重复的文件

已知条件:知道根目录地址

实现思路:1.从指定路径开始读取,利用glob读取每个文件夹中的文件,名称和大小

2.每次检测都判断是否读取过相同名称的文件,如果存在,进一步判断大小是否相同,如果相同则删除掉

import glob
import hashlib
import os
data = {}
def clear(path):
    result = glob.glob(path)
    for _data in result:
        if glob.os.path.isdir(_data):
            _path = glob.os.path.join(_data,'*')
            clear(_path)
        else:
            name = glob.os.path.split(_data)[-1] # 获取文件名
            is_byte = False
            # 判断文件名中是否包含zip,如果包含则说明是二进制文件,需要通过rb进行读取
            if 'zip' in name: 
                is_byte = True
                f = open(_data,'rb')
            else:
                f = open(_data,'r',encoding='utf-8')
            content = f.read()
            f.close()
            # 利用hashlib的md5方法读取文件
            if is_byte:
                hash_content_obj = hashlib.md5(content) 
            else:
                hash_content_obj = hashlib.md5(content.encode('utf-8'))
            hash_content = hash_content_obj.hexdigest()
            # 判断名字是否包含
            if name in data: 
                sub_data = data[name]
                is_delete= False
                for k,v in sub_data.items():
                    if v == hash_content:
                        glob.os.remove(_data)
                        is_delete = True
                if not is_delete:
                    data[name][_data] = hash_content
            else:
                data[name] = {
                    _data:hash_content
                }
if __name__ == '__main__':
    path = glob.os.path.join(glob.os.getcwd(),'*')
    clear(path)
    for k,v in data.items():
        for _k,v in v.items():
            print(_k,v)

七、批量修改文件名

需求:通过程序将目录下的文件名字修改

已知条件:明确根目录、文件名以及需要修改的字符串

实现思路:通过循环,将目标字符串加入到文件名中

import glob
import shutil
def update_name(path):
    result = glob.glob(path)
    # 遍历枚举数据,index自动生成的索引值,data遍历的元素
    for index,data in enumerate(result): 
        if glob.os.path.isdir(data):
            _path = glob.os.path.join(data,'*')
            update_name(_path)
        else:
            path_list = glob.os.path.split(data)
            name = path_list[-1]
            new_name = '%s_%s' % (index,name) # 将索引值和文件名合成一个新的文件名
            new_data = glob.os.path.join(path_list[0],new_name)
            shutil.move(data,new_data)
if __name__ == '__main__':
    path = glob.os.path.join(glob.os.getcwd())
    path += "\\test1copy"
    update_name(path)

你可能感兴趣的:(Python,python)