• python 文件读写、shutil模块


    参考自:https://www.cnblogs.com/alex3714/articles/5717620.html

    1. 文件基础操作

    f = open('test.txt') #打开文件
    first_line = f.readline()       # 每次读一行,并移动文件指针
    print('first line:',first_line) #读一行
    print('分隔线'.center(50,'-'))
    data = f.read()  # 读取剩下的所有内容,会一次性读取到内存,可能导致内存溢出
    print(data)     #打印文件内容
     
    f.close() #关闭文件

    2. with open 语句

    上面的文件操作需要手动关闭文件:f.close(),为了避免打开文件后忘记关闭,可以通过管理上下文,当with代码块执行完毕时,内部会自动关闭并释放文件资源,例如:

    with open('test.txt','r',encoding='utf-8') as f:
        print(f.readline())

    在Python 2.7 后,with又支持同时对多个文件的上下文进行管理,即:

    with open('log1') as obj1, open('log2') as obj2:
        pass

    3. 打开文件的方式

    打开文件的模式有:

    • r, 只读模式(默认)。
    • w,只写模式。【不可读;不存在则创建;存在则删除内容;】
    • a,追加模式。【可读;   不存在则创建;存在则只追加内容;】

    "+" 表示可以同时读写某个文件

    • r+,可读写文件。【可读;可写(作为追加模式);可追加】
    • w+,写读【先写入,后读取,如果存在文件,先覆盖写入,在读取,没啥用】
    • a+,追加写入读取,默认文件指针处在文件的末尾,如果要读取,需要先f.seek(0),而无论文件指针处在什么位置,只要写入,就追加写在文件末尾

    "U"表示在读取时,可以将 自动转换成 (与 r 或 r+ 模式同使用)

    • rU
    • r+U

    "b"表示处理二进制文件(如:图片、视频、音频,FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

    • rb
    • wb
    • ab

    4. 常用方法

    with open('text.txt','r+',encoding='utf-8') as f:
        content = f.read() # 一次性读取文件所有内容,如果文件过大,可能内存溢出
        f.readlines()  # 一次性读取所有文件的行,生成一个列表,效率低
        f.readline()   # 读取文件的一行,效率高
        f.tell()       # 获取文件的指针所在字节位置
        f.seek()       # 移动文件的指针
        f.truncate(8)  # 截取文件前8个字节
        for line in f: # 循环读取文件的行,效率高
            print(line)
    f.write('new message') # 写入文件
    f.flush() # 刷新缓存,直接将文件写入

    2. shutil模块

    import shutil
    
    f1 = open('a.txt','r')
    f2 = open('b.txt','w')
    
    # shutil.copyfileobj(fsrc, fdst[, length])  把fsrc复制到一个新文件fdst里,length代表每次读取的大小,防止内存溢出
    shutil.copyfileobj(f1,f2,1024)
    
    # copy(src, dst, *, follow_symlinks=True)复制一个文件的路径,到另一个路径(可以为路径或者文件名),follow_symlinks在linux生效,具体搜索硬连接和软连接
    shutil.copy('a.txt','../b.txt')
    
    # chown(path, user=None, group=None) 改变给定path的所有者和组权限,似乎在linux生效
    # shutil.chown()
    
    # copy2(src, dst, *, follow_symlinks=True) 复制数据和数据的状态信息
    shutil.copy2('a.txt','../b.txt')
    
    # copymode(src, dst, *, follow_symlinks=True) 仅拷贝权限。内容、组、用户均不变
    shutil.copymode()
    
    # copystat(src, dst, *, follow_symlinks=True) 拷贝状态的信息,包括:mode bits, atime, mtime, flags
    shutil.copystat()
    
    # copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2,
    #              ignore_dangling_symlinks=False) 复制一个文件夹及其内容到另一个文件夹下,ignore过滤条件,可以多个
    # 注意,必须要指定一个文件夹,即把a文件夹的内容,复制到父目录的b里面(b一定不能事先存在)
    shutil.copytree('a','../b',ignore=shutil.ignore_patterns('*.bat','*.py'))
    
    # 获取一个路径的磁盘占用,返回一个三元组(total,used,free)
    print(shutil.disk_usage('D:\'))
    
    # 显示支持的打包格式/解压包的格式
    print(shutil.get_archive_formats())
    print(shutil.get_unpack_formats())
    
    # 打包文件 (包名,格式,要打包的路径)
    shutil.make_archive('a_zip','zip','a')
    
    # 移动文件或文件夹到另一路径: (源文件路径,目标路径)
    shutil.move('a','../')
    
    # 注册一个新的打包方式?
    shutil.register_archive_format()
    shutil.register_unpack_format()
    
    # 删除文件夹及其内容,选择是否忽略错误(默认false,没有要删除的文件夹会报错)
    shutil.rmtree('a',ignore_errors=True)
    # (文件名,[,解压路径,解压方式]) unpack_archive(filename, extract_dir=None, format=None)
    shutil.unpack_archive('a.zip','a')
    
    # shutil.unregister_archive_format()
    # shutil.unregister_unpack_format()

    3. 断点复制

    import os
    
    
    def copy_file(remote_file, local_file, block=10240):
        """
        断点复制文件
        :param remote_file: 想要复制的文件
        :param local_file: 复制到本地的文件
        :param block: 每次复制的大小(字节)
        :return:
        """
        try:
            if os.path.exists(local_file):
                copyed_size = os.path.getsize(local_file)
            else:
                copyed_size = 0
            total_size = os.path.getsize(remote_file)
            if copyed_size != total_size:
                remote_f = open(remote_file, 'rb')
                local_f = open(local_file, 'ab')
                remote_f.seek(copyed_size, 0)  # 移动源文件指针,从没复制过的那部分开始
                while True:
                    con = remote_f.read(block)  # 每次读取 block 大小
                    if not con: break  # 为空说明读完了
                    local_f.write(con)  # 本地写入
                local_f.close()
                remote_f.close()
        except Exception as e:
            print(e)
            return False
        return True
    
    
    copy_file(r'C:pasd.txt', r'password.txt')
  • 相关阅读:
    解决VSCode黑屏和终端空白无法输入的问题
    source map文件还原
    npm下载很慢的解决办法
    清理sqlserver2014的日志
    浏览器横向打印
    Vue3 diff的最长递增子序列 算法详解
    白话科普系列——网站靠什么提升加载速度?
    微服务架构下 CI/CD 如何落地
    网骗欺诈?网络裸奔?都是因为 HTTP?
    有赞统一接入层架构演进
  • 原文地址:https://www.cnblogs.com/wztshine/p/11760369.html
Copyright © 2020-2023  润新知