zoukankan      html  css  js  c++  java
  • os模块、文件压缩 、匹配文件后缀名:fnmatch glob

    一、os模块

    os模块:是python是系统交互的模块

    import os
    # 0平台信息的一些操作
        python是夸平台的,所以内部兼容了不同的平台
            1. os.name  # 操作系统 nt是win
            2. os.sep   # 路径的分隔符。 win是'\' linux是’/‘
            3. os.environ        # 获取环境变量
               os.getenv('PATH') # 获取指定的环境变量,设置自己扩展
               
    
    # 1切换工作路径
    文件的创建,修改等都是在工作路径下进行的
    win下有两种切换路径的方式:
        1. r'd:pythonliv'  # 使用原生字符串避免转义
        2. 'd:\python\liv' # 使用\进行转义
    os.getcwd()  # 获取当前工作路径
    os.chdir('d:\python')   # 更改当前的工作路径
    os.getcwd()  # 获取当前工作路径,查看变化
    
    # 2 执行系统命令
    执行系统命令os有两个方法:
        system    无返回值
        popen    有返回值
    os.system('dir') # 直接打印使用窗口自带编码
    r = os.popen('dir') # 存储到r中
    r.read()    # 通过r来读取,自己转码
    
    # 3.目录操作
    # 创建
    os.mkdir('test') # 只能生成一个文件夹
    os.mkdir(r'.	est1')
    os.makedirs(r'test212') # 递归创建,全部文件都存在则报错
    os.mkkedirs(r'test212') # 文件存在不报错,就不会创建了
    
    # 重命名
    os.rename('test', 'lh')   # 文件夹重命名
    
    # 删除
    os.rmdir('test/1') # 删除单个文件夹,文件夹为空时才能删除,一般先删文件,再山文件夹
    os.removedirs('test/1/2/3') # 删除一个文件夹时,如果上级为空,就一起删除,递归上去
    
    os.remove('tste21231.txt') # 删除单个文件
    
    #4. 子目录操作
    os.listdir() # 列出工作目录(或其他路径)下的文件与文件夹
    
    
    5. 获取文件或目录信息
    os.stat('temp') # 获取文件的大小,各种时间,组信息等
    #st_atime: 上次访问的时间。
    #st_mtime: 最后一次修改的时间。
    #st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,
                                        #在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
    os.path.getsize()
    os.path.isdir()
    os.paht.isfile()
    #6. 路径相关path path是os包中的一个子类: # 路径拼接 a = os.path.join(os.getcwd(),'test') # 拼接路径 os.path.exists(a) # 判断路径是否存在 os.path.isdir(a) # 判断是否是一个文件夹 # 绝对路径和相对路径 os.path.abspath('.') # 获取绝对路径 os.path.isabs('.') # 判断是否为绝对路径,不存在也可以 os.path.relpath(a,b) # 返回一个以b为绝对路径,a在b中的相对路径;以b为基准 os.path.relpath(r'C:UsersLH ste2123.txt',r'C:UsersLH ste21232.txt') # 路径分割 a = r'C:UsersLH ste2123' a.split('\') # 在跨平台,只能手动来搞,使用字符串的方法来分割 a.split(os.sep) # 兼容跨平台,使用os.sep来分割,推荐使用这种 os.path.split(a) # 分割最后一个元素,不管是文件还是文件夹 os.path.splitext(a) # 分割后缀名,如果无后缀名则为空 os.path.splitdive(a)# 分割盘符 os.path.dirname(a) # 返回文件夹名字 os.path.basename(a) # 放回最后一个名字(文件或文件夹)
    shutil 模块
    针对os在删除目录的不是很友好,引进了一个模块,进行了一个二次封装。
    import shutil
    os.unlink == os.remove  # 删除单个文件
    shutil.rmtree()   # 删除整个目录,不管下面有没有文件
    shutil.copy()   # 拷贝文件
    shutil.copytree() # 拷贝目录,os模块中没有 shutil.move() # 移动文件,

    案列:

    根据后缀名与大小 得出匹配的文件:

    import os
    import re
    
    x = re.compile('(.*pdf$)|(.*txt$)|(.*exe$)')
    
    os.chdir(r'D:驱动人生软件DTLSoft')
    for root, dir, files in os.walk('.'):
        # root 路径,  dir 该路径下的目录 , files 该路径下的文件
        for i in files:
            path = os.path.join(root, i)
            if x.search(i) and os.stat(path).st_size > 1320:
                print(os.stat(path).st_size, path)

    二、文件的压缩:

    还有一个tarfile,自己扩展

    # 创建压缩
    import zipfile
    lh = zipfile.ZipFile('lh.zip', 'w')  # 创建写对象
    lh.write('1.py', compress_type=zipfile.ZIP_DEFLATED)  # 使用某种算法,添加
    lh.write('2.py', compress_type=zipfile.ZIP_DEFLATED)
    lh.close()
    
    # 查看压缩
    lh = zipfile.ZipFile('lh.zip', 'r')
    print(lh.namelist())
    print(lh.infolist())      # 查看文件中所有的文件信息
    print(lh.getinfo('1.py')) # 查看文件中指定的文件信息
    
    import shutil
    shutil.copy('lh.zip', 'lh-back.zip')
    
    # 解压缩
    import zipfile
    lh = zipfile.ZipFile('lh.zip')
    lh.extractall()
    lh.close()

    三、文件名模块 

    fnmatch 与 glob

    fnmatch

      fnmatch 是用来匹配文件名字的。支持一些简单的正则。

      原来匹配文件名,需要自己写正则来干活,用这个模块可以简单匹配出来。

    *       matches everything
    ? matches any single character
    [seq] matches any character in seq
    [!seq] matches any char not in seq
    import fnmatch,os
    for f in os.listdir():
        if fnmatch.fnmatch(f, '*.txt'):
            print(f)
        elif fnmatch.fnmatch(f, '*.pdf'):
            print(f)

    glob:

      glob是fnmatch的封装。直接路径下符合的文件名,返回一个迭代器。 使用更方便:

      继承fnmatch的正则

    import glob
    for f in glob.glob('[0-9].py'):  # 当前路径
        print(f)

    # 或

    for item in glob.glob(self.source_dir+'/*.jpg'): # 自定义路径
      print(item)

    四、 其他一些读写模块

    4.1 pickle

      序列化,把一些字典,列表等序列化存储直接存储到硬盘,重新加载后就可以读取。

      不支持直接对象序列化(但是可以把对象存储到列表中,再进行序列化)

    方法:

    dumps 与 loads

    import pickle
    # 存储
    a = [1, 2, 3, 'a', 'b', 'c']
    with open('test.pkl', 'wb') as f:
        f.write(pickle.dumps(a))
    
    # 加载
    with open('test.pkl', 'rb') as f:
        b = pickle.loads(f.read())
    print(b)

    可以更近一步,直接写入文件

    import pickle
    # 存储
    a = [1, 2, 3, 'a', 'b', 'c']
    with open('test.pkl', 'wb') as f:
        pickle.dump(a, f)
    # 加载
    with open('test.pkl', 'rb') as f:
        b = pickle.load(f)
    print(b)

    4.2 shelve 

    A "shelf" is a persistent, dictionary-like object.
    用类似字典的方式储存任意的python的对象 (字典,列表也是对象,python一切都对象)
    import shelve
    #
    with shelve.open('1.slv') as so:
        so['louhui'] = '帮我存进去'
        so['ying'] = '我也要'
    
    #
    with shelve.open('1.slv') as sol:
        print(sol['louhui'])
        print(sol['ying'])

    4.3 IO 虚拟文件、临时文件

      当文件 不需要存盘的时候,可以使用这个。

    import io
    a_io = io.StringIO()            # 生成一个IO.stringIo对象,open生成的也是io对象。可以调用IO的各种读写,定位方法
    a_io.write('第二行代码
    ')
    a_io.write('第三行代码')
    
    print('我这里结束啦', file=a_io)  # 利用print的file,把一些东西直接写入到这个a_io流中
    # print(file=a_io)              
    
    content = a_io.getvalue()       # 取流
    print(content)
    
    a_io.close()
  • 相关阅读:
    eclipse中文乱码
    学习进度(7)
    校园管家(Android开发团队项目)NABCD
    NABCD(团队项目)
    android studio连接真机大概问题
    01梦断代码阅读笔记
    学习进度(6)
    android studio学习(一)
    地铁出行系统1.0
    学习进度(4)
  • 原文地址:https://www.cnblogs.com/louhui/p/9060217.html
Copyright © 2011-2022 走看看