04-Python文件操作

打开文件

f=open("我的文件.txt","r",encoding="utf8")  #打开一个文件(读模式)
f.close()  #关闭文件

解释:

  • 参数1:文件路径和文件名
  • 参数2:打开模式,r表示read读
  • encoding指定文件编码为UTF-8
  • 最后不要忘记关闭文件

with语句

写代码过程中,很容易忘记关闭文件,所以出现了with语句

with open("我的文件.txt","r",encoding="utf8") as file:  #自动关闭文件
    data=file.read()    #读取文件
    print(data)

解释:

  • 这种方式会自动关闭文件(防止忘记)
  • 一旦离开了with语句块,就会自动关闭文件
  • 操作文件的对象为变量file
同时打开多个文件:
with open("123.txt","w") as f1,open("456.txt","w") as f2:
    f1.write("Hello 123.txt\n")
    f2.write("Hello 456.txt\n")

读写模式

什么是光标?

操作系统使用光标来读写文件
光标的位置影响读写的位置

常用模式
r	#读模式
w	#写模式,会清空文件
a	#追加模式

r+读写模式:
    根据光标位置读写

w+写读模式:
    会清空文件
    根据光标位置读写

a+追加模式:
    不会清空文件
    打开文件之后自动将光标置于最后,而光标位置只会影响读操作
    每一次追加都会将光标置于最后

rb、wb、ab……:
    以bytes类型读取文件

示例:

下例中的读写模式为r (read读模式)

f=open("我的文件.txt","r",encoding="utf8")

读操作

方法:

data = file.read()   # 读取文件全部信息(不建议,非常占用内存)
data = file.read(5)  # 读取5个字符

示例:

with open("我的文件.txt","r",encoding="utf8") as file:
    data = file.read()  # 读取文件全部信息(不建议,非常占用内存)
    print(data)         # 输出文件内容

写操作

示例:

with open("我的文件.txt","w",encoding="utf8") as file:
    file.write("Hello World")  # 写操作(只是写到缓冲区中)
    file.flush()  # 将缓冲区里的内容写到文件中

解释:

w模式会清空文件
write()函数会将数据写入缓冲区,而不是文件中
flush()函数和关闭文件时,python会将缓冲区中的数据写入文件。

为什么不直接写入文件?

文件存储在磁盘中,如果每一次写入文件都要访问一次磁盘,就会频繁请求磁盘,导致磁盘压力过大。


内置函数

with open("我的文件.txt","r",encoding="utf8") as file:
    data=file.readline()   #输出当前行(光标会移动到下一行)
    data=file.readlines()  #返回一个列表,元素为各行(不使用迭代器)
    location=file.tell()   #返回当前光标位置。按字节返回(一个中文占3个字节)
    file.seek(5)     #设置光标位置

    num=file.fileno()  #返回文件句柄,唯一标识该文件对象
                        #两个程序对同一个文件同时调用,得到的句柄相同
    print(num)

重点:

  • readlines()会读取文件所有内容,如果文件很大则占用内存。
  • 所以大文件不建议使用readlines()
truncate()截断
num=file.truncate() #截断,删除光标后所有字符,返回光标位置
file.truncate(5)    #保留文件开头5个字符,剩下的删除

示例:

with open("我的文件.txt","w",encoding="utf8") as file:
    file.write("1234567890")
    file.flush()
    file.seek(5)
    num=file.truncate()    #文件内容为12345
    print(num)             #结果为5

遍历文件

with open(“我的文件.txt”,“r”,encoding=“utf8”) as file:
    for i in file:
        print(i)  # 使用生成器,不占用内存(所以不要使用readlines()方法)

解释器:

  • 遍历文件:依次读取文件全部内容(这里按行读取)
  • 生成器:每一行依次读取到内存中,而不是全部读取到内存中
  • 不建议使用realines(),特别是读取大文件

将变量值保存在文件中

如何将变量值写入文件中?

  • 思路:

将变量转换为字符串,再写入文件
读取文件后,再将字符串转换为原类型

方法1:eval方式

eval函数可以将字符串类型的数据转换为原来的类型。
如:将字符串'{"姓名":"张三"}'转换为字典{"姓名":"张三"}

示例:

a={'湖南':{'永州':'宁远'}}
a=str(a)   #将a强制转换成字符串(就可以方便写入文件中了)
print(type(a))    #输出:<class 'str'>
a=eval(a)  #读取文件后,将a转换回原来的类型
print(type(a))    #输出:<class 'dict'>
方法2:json方式
import json
a={'江苏':{'镇江':'京口区'}}
data=json.dumps(a)    #转换成json格式 (str类型)
data=json.loads(data)  #转回原格式

解释:

  • json方式缺点:不可转换对象
  • json方式优点:语言之间通用(可被其他语言解析)
方法3:pickle方式
import pickle
a={'江苏':{'镇江':'京口区'}}
data=pickle.dumps(a)   #转换成pickle格式 (str类型)
data=pickle.loads(data)    #转回原格式

解释:

  • pickle方式优点:可以转换所有类型
  • pickle方式缺点:只能在Python中使用
  • 注意:要用rb和wb方式读写文件,因为pickle会将变量转换为bytes类型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章