zoukankan      html  css  js  c++  java
  • Python-18-文件处理

    文件处理流程:
    1、打开文件,得到文件句柄并赋值给一个变量
    2、通过句柄对文件进行操作
    3、关闭文件
    # Example 1
    
    # f = open('a',encoding='utf-8')          # 打开文件,得到文件句柄并赋值给一个变量
    # data = f.read()                          # 通过句柄对文件进行操作
    # print(data)
    # f.close()                                # 关闭文件
    ##################### 打开文件的模式 ##################
    默认为文本模式,只能是字符串(文件没有修改一说,全是覆盖!!)
    r -- 只读模式【默认模式;文件必须存在,不存在则抛出异常】
    w -- 只写模式【不可读;不存在则创建;存在则清空内容】
    a -- 只追加写模式【不可读;不存在则创建;存在则只追加内容】
    x -- 只写模式【不可读;不存在则创建;存在则报错】(不常用,没什么用)
    ##################### 打开文件的模式 ##################
    对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,
    使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb wb ab
    以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    ##################### 打开文件的模式 ##################
    "+" 表示可以同时读写某个文件
    r+, 读写【可读,可写】
    w+, 写读【可读,可写】
    a+, 写读【可读,可写】
    ##################### 打开文件的模式 ##################
    # 1、r -- 只读模式
    
    # f = open('a','r',encoding='utf-8')      # 默认打开模式就为 r
    # data = f.read()                          # 读取文件全部,如果这里读取了,下面再出现readline 就没有文件读取了。
    # print(data)
    # print(f.readable())                       # 结果:True  判断当前文件是否是-只读(r)
    # print(f.readline())                       # 读取文件 第一行 (一次读一行)
    # print(f.readline(),end="")                # 读取文件 第二行 并且第二行、第三行之间没有 另隔一行 换行
    # print(f.readline())                       # 读取文件 第三行
    
    # data = f.readlines()                        # 将文件所有行,按列表的形式输出
    # print(data)
    
    # f.close()
    
    
    # 2、w -- 只写模式
    
    # 写模式--如果文件不存在,新建一个文件;如果文件存在,会把该文件清空(==新建一个空文件,覆盖原文件)
    # f = open('a1','w',encoding='utf-8')
    # f.write("newmet.top == 初相识 01
    ")
    # f.write("newmet.top == 初相识 02
    ")
    # f.write("new
    met.top
    初相识 03
    ")
    # print(f.writable())              # 结果:True  判断当前文件是否是-只写(w)
    # f.writelines(['111
    ','222
    ','333
    '])
    #
    # f.close()
    
    # 3、a -- 只追加写模式
    
    # f = open('a1','a',encoding='utf-8')
    # f.write("写到文件最后")               # 类似 日志访问记录,自动追加到文件最后
    # f.close()
    
    
    # 4、f.close 可以不写,利用with关键字去只写、只读文件:
    
    # 1)打开一个文件:
    with open('a1','w',encoding='utf-8') as f:
        f.write("newmet.top
    初相识
    ")
    
    # 2)同时打开两个文件:
    with open('a','r',encoding='utf-8') as src_f,
            open('a1','w',encoding='utf-8') as dst_f:              # 同一行代码太长,加 enter 换行
        data = src_f.read()
        dst_f.write(data)
    ##################### 文件的修改 ##################
    # 1、文件取出来、修改
    
    src_f = open('文件修改','r',encoding='utf-8')
    data1 = src_f.readlines()      # 列表
    src_f.close()
    
    dst_f = open("文件修改-01","w",encoding="utf-8")
    # f2.writelines(data1)
    dst_f.write(data1[0])
    dst_f.close()
    
    # 2、文件覆盖
    
    src_f = open('文件修改','r',encoding='utf-8')
    data1 = src_f.readlines()      # 列表
    src_f.close()
    
    dst_f = open("文件修改","w",encoding="utf-8")
    # f2.writelines(data1)
    dst_f.write(data1[0])
    dst_f.close()
    
    
    # 上面1、2合并在一起:
    with open('文件修改','r',encoding='utf-8') as src_f,
            open('文件修改-01','w',encoding='utf-8') as dst_f:              # 同一行代码太长,加 enter 换行
        data = src_f.read()
        dst_f.write(data)
    ##################### b模式 ##################
    f = open('a1','rb')             # b模式不能指定编码
    data = f.read()
    print(data)                     # 二进制
    print(data.decode('utf-8'))    # 字符串
    f.close()
    
    
    f = open('a1','wb')             # b模式不能指定编码
    f.write(bytes('newmet
    ',encoding='utf-8'))    # 编码
    f.write('初相识'.encode('utf-8'))               # 编码
    f.close()
    
    f = open('a1','ab')             # b模式不能指定编码
    f.write('初相识'.encode('utf-8'))               # 编码
    f.close()
    ##################### 文件处理的其他方法 ##################
    f=open('a1','r+',encoding='utf-8')
    f.read()            #读取所有内容,光标移动到文件末尾
    f.readline()        #读取一行内容,光标移动到第二行首部
    f.readlines()       #读取每一行内容,存放于列表中
    print(f.encoding)   # 输出 读取时文件使用的编码
    f.flush()           # 刷新 保存
    print(f.name)       # 打印文件名
    
    f=open('a1','r+',encoding='utf-8',newline='')   # 读取文件中真正的换行符号(
    )
    
    # 光标的移动
    # 一: read(3):
    #   1. 文件打开方式为文本模式时,代表读取3个字符
    #   2. 文件打开方式为b模式时,代表读取3个字节
    # 二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
    
    print(f.tell())     # 定位光标位置
    f.readline()
    print(f.tell())
    f.seek(10)
    print(f.tell())
    
    data=f.truncate(10)         # 截取从开始一直到第10个 部分
    print(data)
    
    ############   seek 0、1、2   ##########
    
    # 1、f.seek(3,0)
    # 0 可写可不写,代表从开头位置算起
    f=open('seek.txt','r',encoding='utf-8')
    print(f.tell())           # 0
    f.seek(10)
    print(f.tell())           # 10
    f.seek(3)
    print(f.tell())           # 3
    
    # 2、f.seek(3,1)
    # 1 代表相对位置,从上一次光标所在位置算起
    # 相对位置,只能是b模式,而且不能有encoding编码
    f=open('seek.txt','rb')
    print(f.tell())         # 0
    f.seek(10,1)            # 10
    print(f.tell())
    f.seek(3,1)
    print(f.tell())         # 13
    
    # 3、f.seek(3,2)
    # 2 代表相对位置,从末尾光标所在位置算起
    # 相对位置,只能是b模式,而且不能有encoding编码
    f=open('seek.txt','rb')
    print(f.tell())
    f.seek(-10,2)
    print(f.read())         # 结果:b'2
    newmet3'
    
    ############   seek 0、1、2   ##########
    
    # 看日志最后一行内容:
    
    # 1、基础方法:
    f=open('日志文件','rb')
    data=f.readlines()
    print(data[-1].decode('utf-8'))
    
    # 2、seek方法:
    
    # 看日志最后一行内容:
    f=open('日志文件','rb')
    for i in f:             # 循环文件的推荐方式  要一行给一行
        offs = -3           # 定义一个偏移量
        while True:
            f.seek(offs,2)
            data=f.readlines()
            if len(data)>1:
                print('最后一行:%s'%(data[-1].decode('utf-8')))
                break
            offs*=2
    # 倒序阅读,逐渐增加偏移量
  • 相关阅读:
    mysqldump全量和增量备份脚本
    mysqldump根据通配符批量导出
    xtrabackup2.4_MySQL5.7备份与恢复
    ArrayInt
    Oracle wallet配置登陆凭证
    percona xtrabackup8.0.4备份恢复mysql8.0.12
    mysql修改密码
    range
    一周感悟
    Target
  • 原文地址:https://www.cnblogs.com/newmet/p/10037201.html
Copyright © 2011-2022 走看看