zoukankan      html  css  js  c++  java
  • python文件操作

    文件操作

    一、初识文件操作

    '''
    参数说明:
    file 变量自己取名(也叫文件句柄,对文件的任何操作都得通过:句柄.方式也就是调用系统函数)
    open:python内置封装的函数
    r (r'D:	est.txt'): 加上这个就能识别路径,不加有可能会报错,或者再加一个(D:\test.txt)
    mode:模块 r、rb、   少用:r+b、r+(写读) 四种模式都有下面的读取方式
    encoding:编码方式,Windows默认gbk,Linux(mac)默认utf-8
    file.close(): 关闭文件,每次对文件操作结束都得关闭它
    '''
    
    '''
    文件操作三部曲:
    1、打开文件
    2、对文件句柄进行相应的操作
    3、关闭文件
    '''
    
    例子:
    file = open(r'D:	est.txt',mode='r',encoding='utf-8')
    content = file.read()
    print(content)
    file.close()
    

    二、文件操作之读

    2.1、全读(r):read

    文件内容:
    '''
    高圆圆
    刘亦菲
    张柏芝
    杨紫
    王菲
    '''
    #如果在同一个目录下,直接写文件名称即可,如果不是就写全路径
    #mode 默认就是r,可如果单纯读文件,可 省略不写
    file = open('文件的读.txt',encoding='utf-8',mode='r')
    txt = file.read()
    file.close()
    print(txt)
    

    2.2、按照字符读取(r):read(n)

    #读取第三个
    file = open('文件的读.txt',encoding='utf-8',mode='r')
    txt = file.read(3)
    file.close()
    print(txt)
    

    2.3、按照一行一行读(r):readline

    file = open('文件的读.txt',encoding='utf-8',mode='r')
    txt = file.readline()
    file.close()
    print(txt)
    

    2.4、返回一个列表(r):readlines

    #返回的列表的每一个元素,对应源文件的每一行
    file = open('文件的读.txt',encoding='utf-8',mode='r')
    txt = file.readlines()
    file.close()
    print(txt)
    #['高圆圆
    ', '刘亦菲
    ', '张柏芝
    ', '杨紫
    ', '王菲
    ']
    

    2.5、for循环读取(r)

    file = open('文件的读.txt',encoding='utf-8',mode='r')
    for i in file:
        print(i)
    

    2.6、非文本类型的读(rb):

    #文件放到同目录下
    file = open('test.jpg',mode='rb')
    print(file.read())
    file.close()
    #输出一堆b'xffxd8xffxe0x00x10JFIFx00x01x01x00x00x01x00x01x00x00xf
    

    三、文件操作之写

    • w:写
    • wb:操作非文本类的文件
    • w+:写读 (少用)
    • w+b:以字节类型写读(少用)

    3.1、文件的写:w

    #不写路径默认在当前目录下
    '''
    参数详解:
    f:句柄
    open:调用的函数
    encoding:编码类型
    mode:写的方式
    f.write:写的内容
    f.close 关闭文件
    '''
    f = open('随意写点',encoding='utf-8',mode='w')
    f.write('随意写点呗,你今天顺利吗')
    f.close()
    
    #再次以这个文件名写入文件,会覆盖
    #或者可以理解成,原文件有内容先清空,再写入
    f = open('随意写点',encoding='utf-8',mode='w')
    f.write('Y导,你今天顺利吗')
    f.close()
    

    3.2、文件的写:wb

    #先读,再写---copy
    file = open('test.jpg',mode='rb')
    file1 = open('test1.jpg',mode='wb')
    file1.write(file.read())
    file.close()
    file1.close()
    

    四、文件操作之追加

    • a:追加
    • ab:以字节类型追加
    • a+:追加并可读
    • a+b:少用
    • 追加:文件存在就在后面添加,没有就新建一个把内容写进去

    4.1、追加:a

    file = open('文件的追加.txt',encoding='utf-8',mode='a')
    file.write('随意加点aaa')
    file.close() 
    

    五、 文件操作的其他模式

    • 带+号的模式
    • r+, 读写【可读,可写】:也就是在读文件的时候也可以写文件,写的时候是追加不是覆盖
    • w+,写读【可写,可读】:写的时候可以读
    • a+, 写读【可写,可读】:追加的时候可以读
    假装总结:
    #1. 打开文件的模式有(默认为文本模式):
    r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
    w,只写模式【不可读;不存在则创建;存在则清空内容】
    a, 只追加写模式【不可读;不存在则创建;存在则只追加内容】
    
    #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式)
    rb 
    wb
    ab
    注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
    
    #3,‘+’模式(就是增加了一个功能)
    r+, 读写【可读,可写】
    w+,写读【可写,可读】
    a+, 写读【可写,可读】
    
    #4,以bytes类型操作的读写,写读,写读模式
    r+b, 读写【可读,可写】
    w+b,写读【可写,可读】
    a+b, 写读【可写,可读】
    

    代码演示:r+ (先读再追加,顺序不能错)

    #这个文件得存在,要不然会报错
    f = open('文件的读写(追加)',encoding='utf-8',mode='r+')
    f.write('文件的读写,相当于追加')
    f.close()
    

    image-20200830163539853

    代码演示:w+ (直接覆盖了)

    f = open('文件的写读',encoding='utf-8',mode='w+')
    f.write('文件的写读aaa')
    print(f.read())
    f.close()
    

    代码演示:a+ (在后面追加)

    f = open('文件的a+',encoding='utf-8',mode='a+')
    f.write('c')
    print(f.read())
    f.close()
    

    六. 文件操作的其他功能

    6.1、read(n)
    • 文件打开方式为文本模式时,代表读取n个字符
    • 文件打开方式为b模式时,代表读取n个字节
    6.2、 seek()
    • seek(n)光标移动到n位置,注意: 移动单位是byte,所有如果是utf-8的中文部分要是3的倍数
    • 通常我们使用seek都是移动到开头或者结尾
    • 移动到开头:seek(0)
    • 移动到结尾:seek(0,2) seek的第二个参数表示的是从哪个位置进行偏移,默认是0,表示开头,1表示当前位置,2表示结尾
    • 说白了就是调整光标位置

    代码演示:

    f = open("文件的写读", mode="r+", encoding="utf-8")
    # 光标移动到开头,所以读取就从头开始读取
    f.seek(0)
    # 读取内容, 此时光标移动到结尾
    content = f.read()
    print(content)
    
    # 再次将光标移动到开头
    f.seek(0)
    
    # 将光标移动到结尾,读取内容、什么都没有
    f.seek(0, 2)
    
    # 读取内容. 什么都没有
    content2 = f.read()
    print(content2)
    
    # 移动到开头
    f.seek(0)
    
    # 写入信息. 此时光标在9 中文3 * 3个 = 9
    f.write("张国荣")
    f.flush()
    f.close()
    
    6.3、tell()
    • 使用tell()可以帮我们获取当前光标在什么位置
    • 单位:字节
    • f.flush() 强制刷新
    • 追加之后,光标会在尾部,这时候就得调节光标,这样print才有内容
      代码演示:
    f = open("文件的写读", mode="r+", encoding="utf-8")
    # 将光标移动到结尾
    f.seek(0, 2)
    
    # 读取内容. 什么都没有
    content2 = f.read()
    print(content2)
    
    # 移动到开头
    f.seek(0)
    
    # 写入信息. 此时光标在9 中⽂文3 * 3个 = 9
    f.write("张国荣")
    
    # 光标位置9
    print(f.tell())
    f.flush()
    f.close()
    

    7、打开文件的其他方式

    • 另一种方式:with open() as .... 的形式,那么这种形式有什么好处呢?
    • 优点1:不用手动开关句柄
    • 优点2:可以在同一个地方操作几个文件
    • 缺点:虽然使用with语句方式打开文件,不用你手动关闭文件句柄,比较省事儿,但是依靠其自动关闭文件句柄,是有一段时间的,这个时间不固定,所以这里就会产生问题,如果你在with语句中通过r模式打开t1文件,那么你在下面又以a模式打开t1文件,此时有可能你第二次打开t1文件时,第一次的文件句柄还没有关闭掉,可能就会出现错误,他的解决方式只能在你第二次打开此文件前,手动关闭上一个文件句柄。
    # 1,利用with上下文管理这种方式,它会自动关闭文件句柄。
    with open('t1',encoding='utf-8') as f1:
        f1.read()
        
    # 2,一个with 语句可以操作多个文件,产生多个文件句柄。
    with open('t1',encoding='utf-8') as f1,
            open('Test', encoding='utf-8', mode = 'w') as f2:
        f1.read()
        f2.write('惺惺惜惺惺')
    

    八、文件的修改

    ​ 文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:

    ​ 手动创建一个文件:

    #内容:
    我是原文件
    

    方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)

    文件的修改步骤:
    '''
    1、以读的模式打开一个文件
    2、以写的模式创建一个新文件
    3、把原文件的内容读取出来、写到新文件中
    4、删除原文件
    5、把新文件重命名为原文件
    '''
    方式一:
    import os  # 调用系统模块
    #以读的模式打开一个文件
    file1 = open('原文件.txt',encoding='utf-8',mode='r')
    ywj = file1.read()
    file1.close()
    #以写的模式创建一个新文件
    file2 = open('新文件.txt', encoding='utf-8', mode='w')
    file2.write(ywj)
    file2.close()
    # 删除原文件
    os.remove('原文件.txt')
    
    #将新建的文件重命名为原文件
    os.rename('新文件.txt','原文件.txt')
    
    
    '''
    1、以读的模式打开一个文件
    2、以写的模式创建一个新文件
    3、把原文件的内容读取出来修改成新的内容、写到新文件中()
    4、删除原文件
    5、把新文件重命名为原文件
    '''
    #方式二
    # 调用系统模块
    import os
    with open('原文件.txt',encoding='utf-8') as file1, 
        open('新文件.txt',mode='w',encoding='utf-8') as file2:
        # 3、把原文件的内容读取出来、写到新文件中
        ywj = file1.read()
        new_ywj = ywj.replace('A','S')
        file2.write(new_ywj)
    #删除原文件
    os.remove('原文件.txt')
    #重命名
    os.rename('新文件.txt','原文件.txt')
    

    方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件

    import os
    with open('原文件.txt') as read_f,open('新文件.txt') as write_f:
        for line in read_f:
            line=line.replace('alex','SB')
            write_f.write(line)
    os.remove('a.txt')
    os.rename('.a.txt.swap','a.txt') 
    

    感谢原博主:https://www.cnblogs.com/jin-xin/articles/8183203.html

  • 相关阅读:
    [English Learning]Reading
    [Algorithm]Recurrent Problems_Josephus problem
    字节跳动二面凉经
    2019 Wannafly summer camp Day4
    2019 Wannafly summer camp Day3
    2019 Wannafly summer camp Day2
    暑假补题情况
    2019 Wannafly summer camp Day1
    树形dp学习笔记
    Codeforce Round #553(Div2)
  • 原文地址:https://www.cnblogs.com/hsyw/p/13586057.html
Copyright © 2011-2022 走看看