06、day06_文件的操作

文件的操作

  • 初识

    '''
    open 内置函数,open底层调用的是操作系统的接口
    f1,变量,f1,fh,file_handler,f_h,文件句柄。对文件进行的任何操作,都得通过文件句柄
    encoding:可以不写,不写参数,默认编码本:操作系统默认的编码
    windows:gbk
    linux: utf-8
    macos: utf-8
    f1.close() 关闭文件句柄
    
    文件操作三步:
    1,打开文件
    2,对文件句柄进行相应的操作
    3,关闭文件
    '''
    f1 = open('f:\联系方式.txt', encoding='utf-8', mode='r')
    content = f1.read()
    print(content)
    f1.close()
    
  • 报错原因

    • UnicodeDecodeError:文件存储时与文件打开时的编码本运用不一致
    • 路径如果出现问题:f1 = open(r'f:\联系方式.txt', encoding='utf-8', mode='r'),字符串前面加个r就解决了
    • 文件名不要用数字开头
  • 文件操作的读

    1. r,rb,r+,r+b...

      # 文件操作的读,有四种模式
      # r   rb   r+   r+b
      
      # read 全部读出来  **
      # , mode='r'可以默认不写,不写就是读的打开方式
      # f = open('文件的读', encoding='utf-8')
      # content = f.read()
      # print(content)
      # f.close()  # 一定要写close,一定要写 一定要写
      
      # read(n) 按照字符读取
      # f = open('文件的读', encoding='utf-8')
      # content = f.read(8)  # Murphy是最
      # print(content)
      # f.close()
      
      # readline() 按行读
      # f = open('文件的读', encoding='utf-8')
      # # # content = f.readline()
      # # print(f.readline())
      # # print(f.readline())
      # # print(f.readline())
      # # print(f.readline())
      # # f.close()
      
      # readlines()  多行读取,返回一个列表,列表中的每一个元素是原文件的每一行
      # f = open('文件的读', encoding='utf-8')
      # l1 = f.readlines()
      # print(l1)  # ['Murphy是最帅的\n', 'Murphy是我的英文名\n', '我就是陈年的小纯洁\n', '我已经34岁了,今年年底35岁,\n', '几个月时间争取把python拿下']
      # f.close()
      
      # for 读取  相比上面的方法,这个方法最优,*****
      # 这样循环不论文件有多大,都只占line的一行内存
      # f = open('文件的读', encoding='utf-8')  # 类比为列表
      # for line in f:
      #     print(line)
      # f.close()
      
      # rb:操作的是非文本的文件 ,图片,视频,音频
      # rb模式不用写encoding
      f = open('luoli.jpg', mode='rb')
      content = f.read()
      print(content)
      f.close()
      
  • 文件操作的写

    • w, wb, w+, w+b四种模式

      # 文件的写,w
      # 没有文件创建文件写入内容
      # f = open('文件的写', encoding='utf-8', mode='w')
      # f.write('随便写点啥')
      # f.close()
      
      # 如果文件存在,先清空原文件内容,再写入新内容
      # f = open('文件的写', encoding='utf-8', mode='w')
      # f.write('Murphy最帅!!!!!!')
      # f.close()
      
      # wb操作非文本类文件
      # 首先要以byte类型把文件读出来
      f = open('luoli.jpg', mode='rb')
      content = f.read()
      # print(content)
      f.close()
      # 将读出来的byte类型写入新文件中
      f1 = open('luoli1.jpg', mode='wb')
      f1.write(content)
      f1.close()
      
  • 文件操作的追加

    • a, ab, a+, a+b 四种模式

      # a 没有文件创建文件,追加内容
      # f = open('文件的追加', encoding='utf-8', mode='a')
      # f.write('Murphy最帅')
      # f.close()
      
      # 有文件直接追加
      f = open('文件的追加', encoding='utf-8', mode='a')
      f.write('\n爱好python')
      f.close()
      
  • 文件操作的其它模式

    # r+ 读写:【必须】先读后写(追加) 在这个模式下如果先写后读,会产生覆盖,
    # 并且如果字符样式对不上会报错,比如我写入的逗号覆盖中文就会报错,原文件也会乱码
    f = open('文件的读写', encoding='utf-8', mode='r+')
    content = f.read()
    f.write('人的一切痛苦,本质都是对自己无能的愤怒')
    f.close()
    
  • 文件操作的其它功能

    • 总结:

      三个大方向:

      读,四种模式:r,rb,r+,r+b

      写,四种模式:w, wb, w+, w+b

      追加四种模式:a, ab, a+, a+b

      相应的功能:对文件句柄的操作:read(), read(n), readline(), readlines(),write(),

      tell()是获取光标的位置 单位:字节

      seek()调整光标的位置 单位:字节

      flush

      # flush 强制刷新
      f = open('文件的其它功能', encoding='utf-8', mode='w')
      f.write('fjdlskjflksjdwef')
      f.flush()  # write后跟一个flush
      f.close()
      
  • 打开文件的另一种方式

    # 优点1:不用手动关闭文件句柄
    with open('文件的读', encoding='utf-8') as f1:
        print(f1.read())
    
    # 优点2:可以一次操作多个文件句柄
    with open('文件的读',encoding='utf-8') as f1, \
            open('文件的写', encoding='utf-8', mode='w') as f2:
        print(f1.read())
        f2.write('fdlksjfkljelskfj')
    
    # 缺点
    
  • 文件操作的改

    '''
    1.以读的方式打开原文件
    2.以写的模式创建一个新文件
    3.将原文件的内容读出来修改成新内容,写入新文件
    4.将原文件删除
    5.将新文件重命名为原文件名
    '''
    
    # low版 一旦涉及到大文件,直接干爆内存
    # import os
    # # 1.以读的方式打开原文件
    # # 2.以写的模式创建一个新文件
    # with open('alex自述',encoding='utf-8') as f1, \
    #     open('alex自述.bak',encoding='utf-8',mode='w') as f2:
    #     # 3.将原文件的内容读出来修改成新内容,写入新文件
    #     old_content = f1.read()
    #     new_content = old_content.replace('alex', 'SB')
    #     f2.write(new_content)
    # os.remove('alex自述')
    # os.rename('alex自述.bak', 'alex自述')
    
    # 进阶版
    import os
    # 1.以读的方式打开原文件
    # 2.以写的模式创建一个新文件
    with open('alex自述',encoding='utf-8') as f1, \
        open('alex自述.bak',encoding='utf-8',mode='w') as f2:
        # 3.将原文件的内容读出来修改成新内容,写入新文件
        for line in f1:  # 第一次循环第一行,以此类推,每次只读一行,节省内存
            new_line = line.replace('SB', 'alex')
            f2.write(new_line)  # 写一行(读一行写一行,一行一行执行)
    os.remove('alex自述')
    os.rename('alex自述.bak', 'alex自述')
    
    # 有关清空的问题:在没有关闭文件句柄的情况下,会一直写下去,直到关闭
    # 所以上面for循环中的时候不会关闭句柄,直到循环结束,相当于一直写直到结束循环
    

猜你喜欢

转载自www.cnblogs.com/mikie/p/12623985.html
06