2022年 11月 3日

Python文件操作

        前言:在Python编码中,我们经常会遇到去操作文件的读取和写入,这一方法属于是必备的操作技巧了,现在就一起来康康要怎么操作吧

一、open 函数

        python 提供内置函数 open()实现对文件的操作。python 对文本文件和二进制文件采用统一的操作步骤,和把大象放冰箱里的一样分三步,”打开-操作-关闭。”

  1. open(file, mode='r', encoding=None)
  2. #file 包含文件名的字符串,可以是绝对路径,可以是相对路径。
  3. #mode 一个可选字符串,用于指定打开文件的模式。默认值 r 表示文本读。
  4. #encoding 文本模式下指定文件的字符编码

a)mode参数:

  1. 字符 意义
  2. 'r' 文本读取(默认)
  3. 'w' 文本写入,并先清空文件(慎用),文件不存在则创建
  4. 'x' 文本写,排它性创建,如果文件已存在则失败
  5. 'a' 文本写,如果文件存在则在末尾追加,不存在则创建

a)和 mode 组合的字符:

  1. 字符 意义
  2. 'b' 二进制模式,例如:'rb'表示二进制读
  3. 't' 文本模式(默认),例如:rt 一般省略 t
  4. '+' 读取与写入,例如:'r+' 表示同时读写

c)总结图

二、读文件

  2.1在当前目录下创建一个名为 a.txt 的文本文件,文件中写入下面的内容:

  1. 这里是第一行句子
  2. 这是是第二行句子
  3. 这里是第三行句子

读取的文本图例:

 ——操作步骤:

  1. #open打开文件
  2. fb = open(file=r"C:\Users\LX\PycharmProjects\pythonProject\web_study\a.txt",mode="r",encoding="utf-8")
  3. #读取文件
  4. ct = fb.read()
  5. #打印文件内容
  6. print(ct)
  7. #手动关闭文件
  8. fb.close()
  9. 响应:
  10. 这里是第一行句子
  11. 这是是第二行句子
  12. 这里是第三行句子

2.2 相对路径与绝对路径:

  1. #进行文件处理时经常会碰到相对路径和绝对路径的问题
  2. #打开文件,读取数据。文件的完整路径必须存在,不然就会报错
  3. ——————————————————————————————————————————————————————————————————
  4. 绝对路径:它指定了文件在电脑中的具体位置,以 windows 电脑为例:
  5. d:\class\demon\python入门.py
  6. 相对路径:一般是指相对当前脚本的路径,比如上面的案例中的 a.txt
  7. #相对路径的写法:
  8. #为和当前脚本在同一个文件夹下,所以可以直接使用 test.txt 作为文件名来操作。
  9. with open(file=r"a.txt",mode="r",encoding="utf-8") as fb:
  10. #读取文件
  11. ct = fb.read()
  12. #打印文件内容
  13. print(ct)

2.3 with上下文管理:解决经常会忘记关闭文件句柄,造成资源浪费,所以处理文件是往往使用 with 语句进行上下文管理

  1. with + open(文件地址)as 函数名:
  2. 不需要你手动调用fs.close()
  3. 自动帮你关闭文件
  4. with open(file=r"a.txt",mode="r",encoding="utf-8") as fb:
  5. ct = fb.read()
  6. print(ct)

2.4多种读文件的方式:

 a)read()

  1. with open(file=r"a.txt",mode="r",encoding="utf-8") as fb:
  2. ct = fb.read()
  3. print(ct)
  4. 响应:
  5. 这里是第一行句子
  6. 这是是第二行句子
  7. 这里是第三行句子
  1. #在读模式下,使用文件对象的 read 方法可以读取文件的内容。它接收一个整数参数表示读取内容的大小,文本模式下表示字符数量,二进制模式下表示字节大小。
  2. with open('a.txt', 'r', encoding='utf-8') as f:
  3. content = f.read(3)
  4. print(content)
  5. 响应:共计三个字符
  6. 我是新

b)readline()

  1. with open(file=r"a.txt",mode="r",encoding="utf-8") as fb:
  2. vt = fb.readline()
  3. print(vt)
  4. #响应:
  5. 这里是第一行句子

c)readlines()

  1. with open(file=r"a.txt",mode="r",encoding="utf-8") as fb:
  2. bt = fb.readlines()
  3. print(bt)
  4. 响应:"\n"换行符的字符体现,读出来就是这样表现
  5. ['这里是第一行句子\n', '这是是第二行句子\n', '这里是第三行句子\n']

d)二进制读取:# mode=rb,不需要encoding参数

  1. # mode=rb,不需要encoding参数
  2. with open(file=r"a.txt",mode="rb") as fb:
  3. content =fb.read()
  4. print(content)
  5. #响应:
  6. b'\xe8\xbf\x99\xe9\x87\x8c\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x80\xe8\xa1\x8c\xe5\x8f\xa5\xe5\xad\x90\r\n\xe8\xbf\x99\xe6\x98\xaf\xe6\x98\xaf\xe7\xac\xac\xe4\xba\x8c\xe8\xa1\x8c\xe5\x8f\xa5\xe5\xad\x90\r\n\xe8\xbf\x99\xe9\x87\x8c\xe6\x98\xaf\xe7\xac\xac\xe4\xb8\x89\xe8\xa1\x8c\xe5\x8f\xa5\xe5\xad\x90\r\n'

二、写文件

a)mode=”w”:

  1. with open(file=r"a.txt",mode="w",encoding="utf-8") as fb:
  2. fb.write("我是新写入的内容")
  3. 文本内容:
  4. 我是新写入的内容

运行后会发现之前 a.txt 内容修改为“我是新写入的内容”,因为 w 模式会清除原文件内容,所以小心使用。

b)mode=”a”:

  1. #\n代表换行符,使用就换行
  2. with open(file=r"a.txt",mode="a",encoding="utf-8") as fb:
  3. fb.write("我是第二次写入的内容\n")
  4. 文本内容:
  5. 我是新写入的内容
  6. 我是第二次写入的内容

c).写二进制文件:将图片二进制信息写入文件中,并存到本地。

  1. import requests
  2. url = 'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=1247698508,1430079989&fm=26&gp=0.jpg'
  3. response = requests.get(url)
  4. with open('校花.jpg', 'wb') as f:
  5. f.write(response.content)

c)结果图例:

三、tell 方法:文件对象的 tell 方法返回整数,表示文件指针距离文件开头的字节数

  1. with open('a.txt', 'r', encoding='utf-8') as f:
  2. print(f.tell()) #文件指针距离文件开头的字节数
  3. content = f.read(3)
  4. print(content)
  5. print(f.tell())#文件指针距离文件开头的字节数
  6. 响应:
  7. 0
  8. 我是新
  9. 9

四、seek 方法:通过文件对象的 seek 方法可以移动文件句柄

  1. seek 方法接收两个参数:
  2. offset 表示偏移指针的字节数
  3. whence 表示偏移参考,默认为 0
  4. 0 表示偏移参考文件的开头,offset 必须是 >=0 的整数
  5. 1 表示偏移参考当前位置,offset 可以是负数
  6. 2 表示偏移参考文件的结尾,offset 一般是负数

注意文本模式下只允许从文件的开头进行偏移,也即只支持 whence=0

  1. with open('a.txt', 'r', encoding='utf-8') as f:
  2. print(f.read(3))
  3. # 跳转到文件开头
  4. f.seek(0)
  5. # 再读取第一个字
  6. print(f.read(1))
  7. #响应:
  8. 我是新