Python基础学习笔记(08)文件操作

Python基础学习(08)文件操作

一、今日内容大纲

  • 初识文件操作
  • 文件操作的模式
  • 文件操作的其他功能
  • 打开文件的另一种方式
  • 文件的修改操作

二、文件操作的初识

  1. 利用Python操作为文件,需要的必要参数:

    • 文件路径:Path

    • 打开方式:只读、只写、追加、写读、读写

    • 编码方式:UTF-8、GBK、GB2312等

  2. 文件的基本操作

    先观察一段文件操作的代码:

    f1 = open(r'D:PythonPython Projectday08Japanese Porn.txt',encoding= 'utf-8',mode= 'r')
    content = f1.read()
    print(content)
    f1.close()
    
    • open 是系统内置函数,open 底层调用的是操作系统的接口
    • f1 变量又可写作 f1、fh、file_handler、f_h 等,译为文件句柄,Python语言中对文件进行的任何操作,都需要通过调用文件句柄的函数来实现。
    • encoding 参数可以省略,不写参数会按照操作系统默认的编码来操作
    • close 为关闭文件句柄,每次打开文件后都需要及时关闭文件句柄,否则会占用过多内存。
  3. 文件操作三部曲:

    • 打开文件
    • 对文件句柄进行相应的操作
    • 关闭文件句柄
  4. 报错情况

    • 路径问题:反斜杠会引起歧义
      • 解决方式一:双反斜杠消除歧义,如:'d:Japanese Porn.txt'
      • 解决方式二:使用 raw 字符串,在路径字符串前加字母 r ,就无需使用转义字符了,如:r'd:Japanese Porn.txt'
    • 编码问题:文件存储和打开时用的编码不一致
    • 文件名问题:文件名问题:文件名不可以设置成纯数字,否则会无法识别

三、文件操作的模式(mode)

  1. 文件的读取操作:r 模式、rb 模式、r+ 模式、r+b 模式

    首先先在 py 文件根目录下创建一个”文件的读“文本文件和一个”美女.jpg“图片文件(这样读取时可以只需提供相对路径),供我们读取,其中文本文件内容我们编辑为:

    太白金星最帅
    老男孩最好的老师
    老男孩教育是最好的学校
    dasfasfdasfsda
    asdqwedqwe
    
    • r 模式:操作的是文本文件,会将读取的字节转换成字符

      # 1.read() 
      f = open('文件的读', encoding='utf-8')        # mode是r可以默认不写
      1. read() 全部都出来
      content = f.read()
      print(content)                         		# content 为字符串数据类型
      f.close()
      
      # 2.read(n) 按照字符数量读取,如reaad(n)为读取前n个字符
      content = f.read(4)
      print(content)
      f.close()									# result: 太白金星
      
      # 3.readline() 读一行
      line = f.readline()
      print(line)
      f.close()									# result: 太白金星最帅.
      
      # 4. readlines() 返回一个列表,列表中的每个元素是源文件的每一行
      l1 = f.readlines()
      print(l1)
      f.close()
      # result: ['太白金星最帅
      ', '老男孩最好的老师
      ', '老男孩教育是最好的学校
      ', 'dasfasfdasfsda
      ', 'asdqwedqwe']
      
      # 5. for 读取(占用内存最低,对于大文件最友好)
      for line in f:
          print(line)
      f.close()
      # result:
      # 太白金星最帅
      #
      # 老男孩最好的老师
      #
      # 老男孩教育是最好的学校
      #
      # dasfasfdasfsda
      #
      # asdqwedqwe
      
    • rb 模式:操作的是非文本文件,不会将读取的字节转换成字符

      f = open('美女.jfif',mode='rb')              # 带b的模式操作文件不需要声明编码方式
      content = f.read()
      print(content)
      f.close()
      # result: 
      # b'xffxd8xffxe0x00x10JFIFx00x01x01x01x00Hx00Hx00x00xffxdbx00Cx00x07x05x05x06x05x04x07x06x05x06....
      
  2. 文件的写入操作:w 模式、wb 模式、w+ 模式、w+b 模式

    • w 模式:主要操作文本类文件

      # 没有文件,创建文件,写入内容
      fh = open('文件的写', encoding='utf-8', mode='w')
      fh.write('随便写一点')
      fh.close()
      # 如果文件存在,会先清空原文件内容,再写入新内容
      fh = open('文件的写', encoding='utf-8', mode='w')
      fh.write('再写一点')
      fh.close()
      
    • wb 模式:主要操作非文本类文件,也可操作文本类文件

      # 为了能够成功写入图片,我们参考学习读时的图片的机器语言
      f = open('美女.jpg',mode='rb')
      content = f.read()
      f.close()
      f1 = open('美女2.jfif', mode='wb')
      f1.write(content)
      f1.close()
      
  3. 文件的追加操作:a 模式、ab 模式、a+ 模式、a+b 模式

    • a 模式

      # a 模式
      # 没有文件会创建文件,追加内容
      f = open('文件的追加', encoding='utf-8', mode='a')
      f.write('太白最帅。。。')
      f.close()
      # 有文件会再后面追加
      f = open('文件的追加', encoding='utf-8', mode='a')
      f.write('老八秘制小汉堡')
      f.close()
      
  4. 文件的其他操作模式:

    # r+ 模式:读和追加
    f = open('文件的读写', encoding='utf=8', mode='r+')
    content = f.read()
    print(content)
    f.write('简简单单的晚饭')
    f.close()
    
  5. 文件操作中的”光标“

    文件的操作存在一个“光标”的概念,当你进行读写操作时,光标会随之进行移动,如 f.read() 操作后光标会随着读取停止在文件内容最后一位,此时在进行写的操作,会从光标的位置继续写入。如果在r+模式下先写后读,光标写入覆盖之前的数据,且容易因为不同字符byte占用不同情况引起乱码,所以不能使用。

四、文件操作的其他功能

  1. tell() 获取光标的位置,单位为字节

    # tell() 获取光标的位置,单位为字节
    f = open('文件的读', encoding='utf-8')    # mode是r可以默认不写
    print(f.tell())
    f.read()
    print(f.tell())                         # content 为字符串数据类型
    f.close()
    # result:
    # 0
    # 107
    
  2. seek() 调整光标的位置,单位为字节,返回光标的位置,seek(0, 2)代表将光标调整至末尾

  3. flush() 强制刷新,添加在写入数据之后,可以有效保存数据

    # flush() 强制刷新,添加在写入数据之后,可以有效保存数据
    f = open('文件的其他功能', encoding='utf-8', mode='w')
    f.write('asdasd')
    f.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('dasdas')
# 缺点:待续

六、文件的修改操作

文件修改的核心步骤:

  • 以读的模式打开原文件
  • 以写的模式创建一个新文件
  • 将原文件的内容读出来修改成新内容,写入新文件
  • 将原文件删除
  • 将新文件重命名成原文件

首先先在 创建一个”alex自述“文本文件,供我们读取和修改,其中文本文件内容我们编辑为:

alex是老男孩python发起人,创建人。

alex其实是人妖。

谁说alex是sb?

你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
# low 版
import os
# 1.以读的模式打开原文件
# 2.以写的模式创建一个新文件
with open('alex自述', encoding='utf-8', mode='r') 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)
# 4.将原文件删除
os.remove('alex自述')
# 5.将新文件重命名成原文件
os.rename('alex自述.bak','alex自述')


# 进阶版
import os
# 1.以读的模式打开原文件
# 2.以写的模式创建一个新文件
with open('alex自述', encoding='utf-8', mode='r') 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)              # 文件句柄还未关闭,所以不会重新覆盖
# 4.将原文件删除
os.remove('alex自述')
# 5.将新文件重命名成原文件
os.rename('alex自述.bak','alex自述')
原文地址:https://www.cnblogs.com/raygor/p/13254058.html