• python之文件操作


    文件操作
    文件路径:d:a.txt
    编码方式:utf-8,gbk,GB2312....
    操作方式:只读,只写,写读,读写,追加 等。
    报错原因:
    UnicodeDecodeError: 'gb2312' codec can't decode byte 0xa6 in position 2: illegal multibyte sequence:
      编码不一致,存储文件时编码与打开文件时编码不一致。
    路径问题:
    1,在路径的最前面加转义字符r:r'd:a.txt'
    2,把每个 变成 \ :'d:\a.txt'
    绝对路径: d:a.txt 从根目录开始找
    相对路径: 从当前目录,当前文件夹开始找。

    f = open(r'd:a.txt',encoding='utf-8',mode='r')
    content = f.read()
    print(content)
    f.close()

    '''
    f:文件句柄,可以理解为变量。
    open():python的内置函数(内部调用的是windows的系统命令)

    文件操作的三部曲:
    1,打开文件,产生文件句柄。
    2,对文件句柄进行操作。
    3,关闭文件句柄。
    '''


    文件打开模式:
    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 *****(五小种方式)
      read() ***
      read(n)
      readline()
      readlines()

      for 循环 *****
    rb ***
    r+ *****
    r+b:



    mode可以不写,默认为r模式。
    read(3):
      1. 文件打开方式为文本模式时(r),代表读取3个字符
      2. 文件打开方式为b模式时(rb),代表读取3个字节
    其余的文件内光标移动都是以字节为单位的如:seek,tell,truncate

    具体实例:
    1、r:只读模式[默认模式,文件必须存在,不存在则抛出异常]

    复制代码
    # 1,read 全部读取
    f = open('文件操作1',encoding='utf-8',mode='r')
    content = f.read() 
    print(content)
    f.close()
    
    # 2,read(n):按照字符读取
    f = open('文件操作1',encoding='utf-8',mode='r')
    content = f.read(10) #r模式,按照字符读取(注意,文本的换行符虽然默认不显示,但是也是一个字符)。
    print(content)
    f.close()
    
    # 3, readline 按行读取
    f = open('文件操作1',encoding='utf-8',mode='r')
    print(f.readline()) #读取第一行
    print(f.readline()) #读取第二行...
    f.close()
    
    # 4,readlines 按行全部读取,返回一个list
    f = open('文件操作1',encoding='utf-8',mode='r')
    content = f.readlines()
    print(content)
    f.close()
    
    # 5,for循环。一行一行输出
    f = open('文件操作1',encoding='utf-8',mode='r')
    for line in f:
        print(line.strip())
    f.close()
    复制代码

    2、rb

    复制代码
    f = open('美女1.jpg', mode='rb')
    content = f.read()
    print(content)
    f.close()
    
    f = open('文件操作1', mode='rb')
    content = f.read(9)  # rb模式 n 按照字节读取。
    print(content)
    f.close()
    复制代码

    3、r+(读写):先读后追加。

    复制代码
    f = open('文件操作1',encoding='utf-8',mode='r+')
    content = f.read()
    print(content)
    f.write('666')
    f.close()
    
    f = open('文件操作1',encoding='utf-8',mode='r+')
    content = f.read(3) #r+模式 n按字符读取
    print(content)
    f.write('666')
    f.close()
    
    # 不读直接写:直接从开始覆盖
    f = open('文件操作1',encoding='utf-8',mode='r+')
    f.write('深圳你好')
    f.close()
    复制代码



    二、 写
    w ***
    wb **
    w+
    w+b
    具体实例:
    1、w
    没有文件,创建文件也要写。
    有文件,先清空,后写入。

    f = open('文件操作2', encoding='utf-8',mode='w')
    f.write('深圳市南山区,福田区,罗湖区。。。')
    f.close()

    2、wb

    复制代码
    f = open('美女1.jpg',mode='rb')
    content = f.read()
    print(content)
    
    f1 = open(' 美女2.jpg',mode='wb')
    f1.write(content)
    f.close()
    f1.close()
    复制代码

    3、w+: 写读

    复制代码
    f = open('文件操作2', encoding='utf-8',mode='w+')
    f.write('深圳市南山区,福田区,罗湖区。。。')
    f.seek(3) # 调整光标
    content = f.read()
    print(content)
    f.close()
    复制代码


    三、 追加
    a ***
    ab
    a+
    a+b


    a:
    没有文件,创建文件也要写。
    有文件,直接在文件的最后面追加。

    f = open('文件操作3', encoding='utf-8',mode='a')
    f.write('
    南方水土好。。。')
    f.close()



    四、 文件操作的其他方法
    read() *****
    write() *****
    close() *****
    seek() *****
    tell() *****
    readable() ****
    writable() **** 判断是否可写
    truncate() **



    具体实例:
    其他方法:readable ,writable,seek

    复制代码
    f = open('文件操作1',encoding='utf-8') #不写mode,默认是r
    if f.writable(): #判断是否可写
        content = f.read()
    print(content)
    f.close()
    
    # seek:调整光标到开始seek(0) 调整光标到结尾seek(0,2)。0代表从文件开头开始算起,1代表从当前位置开始算起,2代表从文件末尾算起。
    f = open('文件操作1',encoding='utf-8')
    f.seek(6) # 按照字节去移动光标
    content = f.read()
    print(content)
    f.close()
    
    f = open('文件操作1',mode='rb')
    print(f.read())
    f.seek(6) # 按照字节去移动光标
    content = f.read()
    print(content)
    f.close()
    
    # tell 告知光标的位置 *****
    f = open('文件操作1',encoding='utf-8')
    f.seek(0,2) # 按照字节去移动光标
    print(f.tell())
    f.close()
    
    # truncate:要在writable模式下进行截取(可以在w使用,但是不推荐在w模式下使用)。
    # 可在r+  a+  等使用,表示对原文件进行截取
    # 指定长度的话,就从文件的开头开始截断指定长度,其余内容删除;
    # 不指定长度的话,就从文件开头开始截断到当前位置,其余内容删除。
    f = open('文件操作1',encoding='utf-8',mode='r+')
    print(f.truncate(6)) #以字节截取
    f.close()
    
    # with open:过一段时间自动关闭文件
    # 1,主动关闭文件句柄
    with open('文件操作2',encoding='utf-8') as f1:
        print(f1.read())
    
    # 2,开启多个文件句柄。
    with open('文件操作2',encoding='utf-8') as f1,
    open('文件操作3',encoding='utf-8',mode='w') as f2:
        print(f1.read())
        f2.write('666666')
    复制代码


    五、 文件的改 *****
    1,以读的模式打开原文件,产生一个文件句柄f1.
    2,以写的模式创建一个新文件,产生一个文件句柄f2.
    3,读取原文件内容,进行修改,并将修改后的写入新文件。
    4,将原文件删除。
    5,将新文件重命名成原文件。

    复制代码
    # 方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
    # low版:
    import os
    with open('小白的深度剖析', encoding='utf-8') as f1,
    open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
        old_content = f1.read()
        new_content = old_content.replace('小白','SB')
        f2.write(new_content)
    os.remove('小白的深度剖析')
    os.rename('小白的深度解析.bak', '小白的深度剖析')
    
    # 方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
    # 升级版:
    import os
    with open('小白的深度剖析', encoding='utf-8') as f1,
    open('小白的深度解析.bak',encoding='utf-8',mode='w') as f2:
        for line in f1:
            new_line = line.replace('小白','SB')
            f2.write(new_line)
    os.remove('小白的深度剖析')
    os.rename('小白的深度解析.bak', '小白的深度剖析')
    复制代码
  • 相关阅读:
    关于项目管理的几点建议
    网站性能优化之服务端(一)
    HP CQ35 Windows7声卡驱动安装不上问题
    ubuntu双系统启动时卡死解决办法
    第十九周练习题
    第十六周作业练习题
    第十七周练习题
    第十八周练习题
    第十五周练习题
    第十四周练习题
  • 原文地址:https://www.cnblogs.com/yidashi110/p/10092287.html
Copyright © 2020-2023  润新知