• python文件操作练习


    1.获取后缀名
    
    import os
    file_ext = os.path.splittext('./data/py/test.py')
    front,ext = file_ext
    print(front,ext)
    #'./data/py/test'      
    #'.py'
    
    
    2.创建文件夹
    def mkdir(path):
        isexists = os.path.exists
        if not isexists:
            os.mkdir(path)
    
    3.路径中的文件名
    file_exts = os.path.split('./data/py/test.py')
    ipath,ifile = file_exts
    print(ipath,ifile)
    
    #'./data/py'
    #'test.py'
    
    4.批量修改文件后缀
    #本例子使用Python的os模块和 argparse模块,将工作目录#work_dir下所有后缀名为old_ext的文件修改为后缀名为#new_ext
    import os 
    import argparse
    
    #定义脚本参数
    def get_parser():
        parser = argparse.ArgumentParser(
            description='工作目录中文件后缀名修改')
        parser.add_argument('work_dir', metavar='WORK_DIR', type=str, nargs=1,
                            help='修改后缀名的文件目录')
        parser.add_argument('old_ext', metavar='OLD_EXT',
                            type=str, nargs=1, help='原来的后缀')
        parser.add_argument('new_ext', metavar='NEW_EXT',
                            type=str, nargs=1, help='新的后缀')
        return parser
    
    #后缀名批量修改
    def batch_rename(work_dir, old_ext, new_ext):
        """
        传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
        """
        for filename in os.listdir(work_dir):
            # 获取得到文件后缀
            split_file = os.path.splitext(filename)
            file_ext = split_file[1]
            # 定位后缀名为old_ext 的文件
            if old_ext == file_ext:
                # 修改后文件的完整名称
                newfile = split_file[0] + new_ext
                # 实现重命名操作
                os.rename(
                    os.path.join(work_dir, filename),
                    os.path.join(work_dir, newfile)
                )
        print("完成重命名")
        print(os.listdir(work_dir))
    
    #实现Main
    def main():
        """
        main函数
        """
        # 命令行参数
        parser = get_parser()
        args = vars(parser.parse_args())
        # 从命令行参数中依次解析出参数
        work_dir = args['work_dir'][0]
        old_ext = args['old_ext'][0]
        if old_ext[0] != '.':
            old_ext = '.' + old_ext
        new_ext = args['new_ext'][0]
        if new_ext[0] != '.':
            new_ext = '.' + new_ext
    
        batch_rename(work_dir, old_ext, new_ext)
    
    
    5.xls批量转换成xlsx
    import os
    
    
    def xls_to_xlsx(work_dir):
        """
        传递当前目录,原来后缀名,新的后缀名后,批量重命名后缀
        """
        old_ext, new_ext = '.xls', '.xlsx'
        for filename in os.listdir(work_dir):
            # 获取得到文件后缀
            split_file = os.path.splitext(filename)
            file_ext = split_file[1]
            # 定位后缀名为old_ext 的文件
            if old_ext == file_ext:
                # 修改后文件的完整名称
                newfile = split_file[0] + new_ext
                # 实现重命名操作
                os.rename(
                    os.path.join(work_dir, filename),
                    os.path.join(work_dir, newfile)
                )
        print("完成重命名")
        print(os.listdir(work_dir))
    
    
    xls_to_xlsx('./data')
    
    # 输出结果:
    # ['cut_words.csv', 'email_list.xlsx', 'email_test.docx', 'email_test.jpg', 'email_test.xlsx', 'geo_data.png', 'geo_data.xlsx',
    'iotest.txt', 'pyside2.md', 'PySimpleGUI-4.7.1-py3-none-any.whl', 'test.txt', 'test_excel.xlsx', 'ziptest', 'ziptest.zip']
    
    
    6.定制文件不同行
    #比较两个文件在哪些行内容不同,返回这些行的编号,行号编号从1开始。
    
    定义统计文件行数的函数
    # 统计文件个数
        def statLineCnt(statfile):
            print('文件名:'+statfile)
            cnt = 0
            with open(statfile, encoding='utf-8') as f:
                while f.readline():
                    cnt += 1
                return cnt
    
    统计文件不同之处的子函数:
    # more表示含有更多行数的文件
            def diff(more, cnt, less):
                difflist = []
                with open(less, encoding='utf-8') as l:
                    with open(more, encoding='utf-8') as m:
                        lines = l.readlines()
                        for i, line in enumerate(lines):
                            if line.strip() != m.readline().strip():
                                difflist.append(i)
                if cnt - i > 1:
                    difflist.extend(range(i + 1, cnt))
                return [no+1 for no in difflist]
    
    主函数:
    # 返回的结果行号从1开始
    # list表示fileA和fileB不同的行的编号
    
    def file_diff_line_nos(fileA, fileB):
        try:
            cntA = statLineCnt(fileA)
            cntB = statLineCnt(fileB)
            if cntA > cntB:
                return diff(fileA, cntA, fileB)
            return diff(fileB, cntB, fileA)
    
        except Exception as e:
            print(e)
    
    比较两个文件A和B,拿相对较短的文件去比较,过滤行后的换行符
    和空格。
    
    暂未考虑某个文件最后可能有的多行空行等特殊情况
    
    使用file_diff_line_nos 函数:
    if __name__ == '__main__':
        import os
        print(os.getcwd())
    
        '''
        例子:
        fileA = "'hello world!!!!''
                'nice to meet you'
                'yes'
                'no1'
                'jack'"
        fileB = "'hello world!!!!''
                'nice to meet you'
                'yes' "
        '''
        diff = file_diff_line_nos('./testdir/a.txt', './testdir/b.txt')
        print(diff)  # [4, 5]
    
    
    
    7.获取指定后缀名的文件
    import os
    
    def find_file(work_dir,extension='jpg'):
        lst = []
        for filename in os.listdir(work_dir):
            print(filename)
            splits = os.path.splitext(filename)
            ext = splits[1] # 拿到扩展名
            if ext == '.'+extension:
                lst.append(filename)
        return lst
    
    r = find_file('.','md') 
    print(r) # 返回所有目录下的md文件
    
    
    8.批量获取文件修改时间
    # 获取目录下文件的修改时间
    import os
    from datetime import datetime
    
    print(f"当前时间:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
    
    def get_modify_time(indir):
        for root, _, files in os.walk(indir):  # 循环D:works目录和子目录
            for file in files:
                absfile = os.path.join(root, file)
                modtime = datetime.fromtimestamp(os.path.getmtime(absfile))
                now = datetime.now()
                difftime = now-modtime
                if difftime.days < 20:  # 条件筛选超过指定时间的文件
                    print(f"""{absfile}
                        修改时间[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
                        距今[{difftime.days:3d}天{difftime.seconds//3600:2d}时{difftime.seconds%3600//60:2d}]"""
                          )  # 打印相关信息
    
    
    get_modify_time('./data')
    
    
    9.批量压缩文件
    import zipfile  # 导入zipfile,这个是用来做压缩和解压的Python模块;
    import os
    import time
    
    
    def batch_zip(start_dir):
        start_dir = start_dir  # 要压缩的文件夹路径
        file_news = start_dir + '.zip'  # 压缩后文件夹的名字
    
        z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
        for dir_path, dir_names, file_names in os.walk(start_dir):
            # 这一句很重要,不replace的话,就从根目录开始复制
            f_path = dir_path.replace(start_dir, '')
            f_path = f_path and f_path + os.sep  # 实现当前文件夹以及包含的所有文件的压缩
            for filename in file_names:
                z.write(os.path.join(dir_path, filename), f_path + filename)
        z.close()
        return file_news
    
    
    batch_zip('./data/ziptest')
  • 相关阅读:
    DIY组装机
    伯努利数学习笔记的说...
    心得分享 | 软件研发效能(1)
    开发板烧录教程
    解决Windows7/10系统连接网线后显示“未识别的网络”的问题
    雷达扫描
    经验学习
    1045 Access denied for user 'root'@'localhost' (using password:YES)
    json格式化工具
    mysql安装出现error Nr.1045
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/12607653.html
Copyright © 2020-2023  润新知