python_办公自动化_常见文件(文件夹)操作

前言

本周开始正式学python,由于python的应用场景较多,比如爬虫,python办公自动化等等.然后就感觉python办公自动化应该比较简单,所以简单学了一下.本文是学习记录,主要是记录一些小脚本.如有错误,欢迎指正.
参考教程:https://www.bilibili.com/video/BV1Th411W7bo/?spm_id_from=333.337.search-card.all.click&vd_source=2293bafd0dc9ba39864a22335638ecfc

案例1:批量移动文件/文件夹

#前提:都需要导入os,shutil模块
import os
import shutil
#判断和创建文件夹:
if os.path.exits('packge01'):
  print("存在")
else:
  os.mkdir('packge01')
#删除
shutil.rmtree('packge01')
#复制并移动文件
shutil.copy("demo01.py","package01")
shutil.copytree('naval','package01/noval2')
#其中的noval2可与naval相同,也可不同,该操作的作用是将当前目录下的naval文件夹下的所有东西的复制到package01/noval2文件夹下

#只是移动文件/文件夹,不进行复制
shutil.move('a.txt','package01/noval')

#切换目录
os.chdir('package01/noval')#有一个拼凑过程,这里package01是位于当前目录下的文件夹,而不是最高级目录下的文件夹

#显示出当前路径
print(os.getcwd())

#删除当前目录下的文件
os.remove('a.txt')

案例2.文件的创建与读取:

文件的读操作:

#文件的读操作
f = open('a.txt',mode='r') #若是txt文件,则可以删去mode='r'这个部分
#常用的open()参数(尤其对于二进制而言):open('a.txt',mode='rb',encoding='utf-8'),读二进制数时需要加上b
context = f.read()
#可以限定读取的字符数量:f.read(20),读取前20个字符
print(context)
f.close()
with open('a.txt') as f:
    context  = f.read();
    print(context)

判断文件的编码方式:https://blog.csdn.net/tcc2430/article/details/87282770

#方式1
# -*- coding: utf-8 -*-
import chardet
import string
import os

os.chdir(r'F:\文本分析')
file='rg2.csv'
with open(file, 'rb') as f:
    data = f.read()
    f_charInfo=chardet.detect(data)
    print (f_charInfo)
#方式二
import codecs
def handleEncoding(original_file,newfile):
    #newfile=original_file[0:original_file.rfind(.)]+'_copy.csv'
    f=open(original_file,'rb+')
    content=f.read()#读取文件内容,content为bytes类型,而非string类型
    source_encoding='utf-8'
    #确定encoding类型
    try:
        content.decode('utf-8').encode('utf-8')
        source_encoding='utf-8'
    except:
        try:
            content.decode('gbk').encode('utf-8')
            source_encoding='gbk'
        except:
            try:
                content.decode('gb2312').encode('utf-8')
                source_encoding='gb2312'
            except:
                try:
                    content.decode('gb18030').encode('utf-8')
                    source_encoding='gb18030'
                except:
                    try:
                        content.decode('big5').encode('utf-8')
                        source_encoding='gb18030'
                    except:
                        content.decode('cp936').encode('utf-8')
                        source_encoding='cp936'
    f.close()
    
    #按照确定的encoding读取文件内容,并另存为utf-8编码:
    block_size=4096
    with codecs.open(original_file,'r',source_encoding) as f:
        with codecs.open(newfile,'w','utf-8') as f2:
            while True:
                content=f.read(block_size)
                if not content:
                    break
                f2.write(content)

文件的写(w-覆盖,a-追加,与C相似)操作:

with open('b.txt',mode= 'a+',encoding='gbk') as f:
    f.write('hello world i love 122')

案例3:

import os
import datetime
import shutil
import glob  # 更方便的实现递归的遍历

path = input("请输入要查询的路径: ")
os.chdir(path)
if not os.path.exists('最新视频'):  # 这里if语句还与not相配合
    os.mkdir('最新视频')  # 没有则创建这个文件夹
for dirpath, dirname, files in os.walk('./'):  # os.walk返回三元组的数据
    for file in os.scandir(dirpath):  # 这两个for循环对文件进行遍历
        if file.name.endswitch('.mp4'):  # 判断遍历的文件是否是以mp4结尾,file.name指的是字符串
            tm = datetime.datetime.fromtimestamp(file.stat().st_mtime)  # 获取修改时间
            # fIle.stat().st_mtime指的是获取时间戳,fromtimestamp()是进行格式化转换
            new_file = str(tm.year) + '-' + str(tm.month) + '-' + str(tm.day) + '-' + file.name  # 拼接新的文件名
            os.rename(dirpath + '/' + file.name, new_file)  # 进行文件的重命名,dirpath指的是当前目录
file_ls = glob.glob('*.mp4') #glob.glob()进行文件的搜索
for name in file_ls:
    shutil.move(name, '最新视频/')  # 移动所有的文件,把name文件移动到最新视频这个文件夹下,加反斜杠来表示他是一个目录
print('Over!')

更多:(链接)

os.path.abspath() :规范化路径

案例4:临时文件(文件夹)的创建

临时文件的创建:tempfile模块

摘要:
1.涉及1个模块:tempfile,两个类:TemporaryDirectory和TemporaryFile
2.TemporaryFile的中有一个delete参数,默认值为true(即删除),若改为false,则为不删除

from tempfile import TemporaryDirectory,TemporaryFile
#临时dir
from tempfile import TemporaryDirectory,TemporaryFile
with TemporaryDirectory() as temp_dir:
    print('文件夹已经创建: ',temp_dir)
#临时file
with TemporaryFile(mode='w+') as temp_file:
  #当读取的文件不是二进制时,就要必须写:mode="w+"
    temp_file.write('我是一个文件搬运工! ')
    temp_file.seek(0)#相当于是移动指针到最初的位置
    data = temp_file.read()
    print(data)

案例5.压缩和解压缩文件:

摘要:
1.涉及两个模块:os,zipfile
摘要:
解决乱码:
print(file_name.encode('cp437').decode('utf-8'))

压缩:

import os
import zipfile

dir_list = os.listdir()
# print(dir_list)  # 读取所有的file和directorary
# 将后缀名为.txt的文件的复制产物放到压缩包myfile.zip中
with zipfile.ZipFile('myfile.zip', 'w') as zipobj:  # 注意myfile.zip中一定要加后缀
    #关于w:压缩文件在代码执行之前,在当前目录下必须不存在,如果存在,则应将w改为a
    for file in dir_list:  # 可见in后面必须是list(字典)
        if file.endswith('.txt'):
            zipobj.write(file)
#查看压缩包里有哪些文件;若想查看文件的具体内容,则需要先解压
with zipfile.ZipFile('myfile.zip', 'r') as zipobj:
    print(zipobj.namelist())

解压缩:

import os
import zipfile
with zipfile.ZipFile('myfile.zip', 'r') as zipobj:
    #解压单个文件
    zipobj.extract('a.txt','./') #要预先知道压缩包名称,待解压的file的名称
    #解压所有文件:
    zipobj.extractall('file/')

案例6:综合应用:

import os
import shutil
import zipfile
from datetime import datetime

# 输入路径
path = input('请输入路径: ')
os.chdir(path)

# 创建文件列表并遍历当前路径的文件
file_list = []
for dirpath, dirname, files in os.walk('./'):
    # 获取每个文件夹中的文件,即遍历所有的dir和file
    for file in os.scandir(dirpath):
        # 判断是否是一个文件夹:
        if not file.is_dir():
            # 如果不是文件夹则获取文件的创建时间
            file_time = file.stat().str_mtime
            file_datetime = datetime.fromtimestamp(file_time)
            datetime_delta = datetime.now() - file_datetime
            # 获取是md文件并且是大于1个月的文件
            if datetime_delta.days >= 31 and file.name.endswitch('md'):
                # 构造新的名字
                new_name = f'{file_datetime.strftime("%Y-%m-%d")}-{file.name}'
                # 对文件进行重命名
                os.rename(dirpath + '/' + file.name, new_name)
                # 将重命名的文件追加到file_list列表
                file_list.append(new_name)
        print(file_list)
# 判断是否存在'长期未使用'文件夹,没有则创建
if not os.path.exists('长期未使用'):
    os.mkdir('长期未使用')
# 将所有file_list中的文件批量移动到"长期未使用"
for filel in file_list:
    shutil.move(filel, '长期未使用/')
# 切换操作目录到长期未使用,并获取里面的文件
os.chdir('长期未使用/')
zipfile_list = os.listdir('./')
# 将里面所有文件进行压缩打包
zip_filename = f'{datetime.now().strftime("%Y-%m-%d")}_长期未使用.zip'  # 最外层必须是单引号
with zipfile.ZipFile(zip_filename, 'w') as zipobj:
    for file in zipfile_list:
        zipobj.write(file)

小结

常用的模块如下:(PS:某些模块好像在SSTI里出现过)

os,shutil,chardet,datetime,glob(递归,遍历),tempfile(临时文件),zipfile(压缩文件)
其中重点介绍一下os.shutil,datetime,glob模块

os模块:

os.chdir():改变当前目录到指定路径,即切换目录 

os.mkdir():创建文件夹 
如: os.mkdir('packge01')

os.path.exits():判断当前目录下文件的存在与否,存在返回true,否则返回false,常用于if语句
如: if os.path.exits('packge01')

os.getcwd():当前路径,print(os.getcwd())表示打印当前文件所在路径
如: print(os.getcwd())

os.remove():删除当前目录下的文件
如: os.remove('a.txt')

os.scaner():常用于对目标的遍历
如: for file in os.scandir(dirpath):  # 这两个for循环对文件进行遍历

shutil模块:

shutil.rmtree():删除文件
如:shutil.rmtree('packge01')

shutil.copy:将文件从源复制到目标路径
如: shutil.copy("demo01.py","package01")

shutil.copytree:将文件夹从源复制到目标路径
如: shutil.copytree('naval','package01/noval2')

shutil.move:将文件从源移动到目标路径
如: shutil.move('a.txt','package01/noval')

其他:

chardet:
chardet.detect():检测文件编码
chardet.detect("hello world")

glob:
glob.glob():对目标文件进行文件的递归遍历检索,涉及到正则
如:file_ls = glob.glob('*.mp4') #glob.glob()进行文件的搜索

datetime:
tm = datetime.datetime.fromtimestamp(file.stat().st_mtime)  # 获取修改时间
tm.year,tm.month,tm.day:分别获得年,月,日

这里只是简单的小结,还得多多模仿案例,直到自己能独立敲下案例中的代码为止.

posted @   starme  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示