当前位置: 首页 > 工具软件 > leap-day > 使用案例 >

python实战打卡---day8

万俟英锐
2023-12-01

Python⽂件IO操作涉及⽂件读写操作,获取⽂件 后缀名 ,修改后缀名,获取⽂件修改时间, 压缩 ⽂ 件, 加密 ⽂件等操作。

Python⽇期章节,由表⽰⼤⽇期的 calendar, date模块,逐渐过渡到表⽰时间刻度更⼩的模块: datetime, time模块,按照此逻辑展开。

Python 多线程 希望透过5个⼩例⼦,帮助你对多线程模型编程本质有些更清晰的认识。

  1. 获取后缀名

    import os
    file_next=os.path.splitext("C:/jupyter_notebook/venv_env/json.txt")
    front,next=file_next
    front # 'C:/jupyter_notebook/venv_env/json'
    next # '.txt'
    
  2. 文件读操作

    import os
    # 创建文件夹
    def mkdir(path):
        isexists=os.path.exists(path)
        if not isexists:
            os.mkdir(path)
    # 读取文件信息
    def openfile(filename):
        f=open(filename)
        fllist=f.read()
        f.close()
        return fllist #返回读取内容
    
  3. 文件写操作

    # 写⼊⽂件信息
    # example1
    # w写⼊,如果⽂件存在,则清空内容后写⼊,不存在则创建
    f = open(r"C:/jupyter_notebook/venv_env/test1.txt", "w", encoding="utf-8")
    print(f.write("测试⽂件写⼊"))
    f.close()
    # example2
    # a写⼊,⽂件存在,则在⽂件内容后追加写⼊,不存在则创建
    f = open(r"C:/jupyter_notebook/venv_env/test1.txt", "a", encoding="utf-8")
    print(f.write("测试⽂件写⼊"))
    f.close
    # example3
    # with关键字系统会⾃动关闭⽂件和处理异常
    with open(r"C:/jupyter_notebook/venv_env/test1.txt", "w") as f:
        f.write("hello world!")
    
  4. 路径中的文件名

    import os
    file_ext=os.path.split('C:/jupyter_notebook/venv_env/test1.txt')
    ipath,file=file_ext
    ipath # 'C:/jupyter_notebook/venv_env'
    file # 'test1.txt'
    
  5. 批量修改文件后缀

    本例⼦使⽤Python的 os模块和 argparse模块,将⼯作⽬录 work_dir下所有后缀名为 old_ext的⽂ 件修改为后缀名为 new_ext

    import argparse
    import os
    # 定义脚本参数
    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 parse
    # 后缀名批量修改
    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))
    # 实现
    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)
    
  6. 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']
    '''
    
  7. 定制文件不同行

    ⽐较两个⽂件在哪些⾏内容不同,返回这些⾏的编号,⾏号编号从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,拿相对较短的⽂件去⽐较,过滤⾏后的换⾏符 \n和空格。 暂未考虑某个⽂件最后可能有的多⾏空⾏等特殊情况 使⽤ 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]
    
  8. 获取指定后缀名文件

    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⽂件
    
  9. 批量获取文件修改时间

    # 获取⽬录下⽂件的修改时间
    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')
    
  10. 批量压缩文件

    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')
    
  11. 32位加密

    import hashlib
    # 对字符串s实现32位加密
    def hash_cry32(s):
        m = hashlib.md5()
        m.update((str(s).encode('utf-8')))
        return m.hexdigest()
    print(hash_cry32(1)) # c4ca4238a0b923820dcc509a6f75849b
    print(hash_cry32('hello')) # 5d41402abc4b2a76b9719d911017c592
    
  12. 年的日历图

    import calendar
    from datetime import date
    mydate = date.today()
    year_calendar_str = calendar.calendar(2022)
    print(f"{mydate.year}年的⽇历图:{year_calendar_str}\n")
    
    2022年的⽇历图:                                  2022
    
          January                   February                   March
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                    1  2          1  2  3  4  5  6          1  2  3  4  5  6
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       7  8  9 10 11 12 13
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      14 15 16 17 18 19 20
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      21 22 23 24 25 26 27
    24 25 26 27 28 29 30      28                        28 29 30 31
    31
    
           April                      May                       June
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3                         1             1  2  3  4  5
     4  5  6  7  8  9 10       2  3  4  5  6  7  8       6  7  8  9 10 11 12
    11 12 13 14 15 16 17       9 10 11 12 13 14 15      13 14 15 16 17 18 19
    18 19 20 21 22 23 24      16 17 18 19 20 21 22      20 21 22 23 24 25 26
    25 26 27 28 29 30         23 24 25 26 27 28 29      27 28 29 30
                              30 31
    
            July                     August                  September
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                 1  2  3       1  2  3  4  5  6  7                1  2  3  4
     4  5  6  7  8  9 10       8  9 10 11 12 13 14       5  6  7  8  9 10 11
    11 12 13 14 15 16 17      15 16 17 18 19 20 21      12 13 14 15 16 17 18
    18 19 20 21 22 23 24      22 23 24 25 26 27 28      19 20 21 22 23 24 25
    25 26 27 28 29 30 31      29 30 31                  26 27 28 29 30
    
          October                   November                  December
    Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
                    1  2          1  2  3  4  5  6                1  2  3  4
     3  4  5  6  7  8  9       7  8  9 10 11 12 13       5  6  7  8  9 10 11
    10 11 12 13 14 15 16      14 15 16 17 18 19 20      12 13 14 15 16 17 18
    17 18 19 20 21 22 23      21 22 23 24 25 26 27      19 20 21 22 23 24 25
    24 25 26 27 28 29 30      28 29 30                  26 27 28 29 30 31
    31
    
  13. 判断是否为闰年

    import calendar
    from datetime import date
    mydate = date.today()
    is_leap = calendar.isleap(mydate.year)
    print_leap_str = "%s年是闰年" if is_leap else "%s年不是闰年\n"
    print(print_leap_str % mydate.year) # 2022年不是闰年
    
  14. 三月的日历图

    import calendar
    from datetime import date
    mydate = date.today()
    month_calendar_str = calendar.month(mydate.year, mydate.month)
    print(f"{mydate.year}年-{mydate.month}⽉的⽇历图:{month_calendar_str}\n")
    
    2022年-7⽉的⽇历图:     July 2022
    Mo Tu We Th Fr Sa Su
                 1  2  3
     4  5  6  7  8  9 10
    11 12 13 14 15 16 17
    18 19 20 21 22 23 24
    25 26 27 28 29 30 31
    
 类似资料: