zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    【BZOJ 4151 The Cave】
    【POJ 3080 Blue Jeans】
    【ZBH选讲·树变环】
    【ZBH选讲·拍照】
    【ZBH选讲·模数和】
    【CF Edu 28 C. Four Segments】
    【CF Edu 28 A. Curriculum Vitae】
    【CF Edu 28 B. Math Show】
    【CF Round 439 E. The Untended Antiquity】
    【CF Round 439 C. The Intriguing Obsession】
  • 原文地址:https://www.cnblogs.com/miaoweiye/p/12607653.html
Copyright © 2011-2022 走看看