文件操作
文件是操作系统提供给用户操作复杂硬件的载体。开发者/管理员,应用程序需要永久保存数据,就需要文件这种载体。在python中操作文件有两种方式
方式一
f = open(r'文件路径') # 向操作系统发送请求,读取文件 print(f) # f是文件对象 print(f.read()) # 打印读出的内容 window操作系统默认以gbk模式解码数据 f.close() # 关闭文件
文件路径有两种,一种是绝对路径,如:D:pycharmEducation课程python基础 4,文件操作a.txt。这就是一种绝对路径,告诉系统文件在哪里。另一种便是相对路径,如:a.txt。这是相对路径。相对路径有要求,必须在运行文件操作程序同级文件夹下,下级文件和上级文件夹下都无法读取。此为,在文件前加‘r'告诉系统这是文件路径,其中 ,都是文件路径格式,没有其他任何意义。当然不闲麻烦还可以:D://pycharm/Education/课程/python基础 4,文件操作a.txt。还可以这种方式写文件路径。
在这种模式下读取完文件后,一定要关闭一下读取文件操作。f.close(),如果我们不关闭文件,那么系统不会立即关闭读取文件的请求,这样会占用系统的资源。
方式二
上下文操作。
with open(r'文件路径‘) as f: # 或者 with open(r'文件路径’)as f, open(r'文件路径‘)as f1: 同时打开多个文件
这种方式下打开文件,当我们回车写指令对文件操作。指令缩进,所有的程序指令就这这个文件操作的子代码块。如果想要关闭。就和这with对齐,成为同级代码,python程序就会关闭对这个文件系统请求操作。
对于文件操作的模式有三种:1,'r'只读模式,'w'只写模式,'a'追加写模式。操作文件单位的有两种方式。t文本文件方式;b二进制文件方式。二进制文件方式视频,图片等我们都可以用这种模式。
文件操作"with open(r'文件路径', mode = 'rt', encoding = 'utf-8')“,其中”mode=' ' ”就是操作模式的选择,encoding = '' 就是以什么格式经行解码。在mode 位置也可以不写mode = '' ,直接写’r',python默认是t文本文件。
在'r'只读模式下,如果文件不存在,系统会报错。读文件,当文件内容读完后,在进行读操作只能读到空白。
# 只读模式下的内置操作 f.readable() # 判读是否可读 f.read() # 读取信息 f.readline() # 对文件单行数据读取 f.readlines() # 读取文件所有行
在'w‘只写模式下,如果文件不存在,那么将会自动创建以该名命名的一个文件。写文件时,写的信息会覆盖原来的信息,是原来的信息会丢失。
# 只读模式的内置操作 f.writable() # 判读是否可写 f.write() # 写数据到文件 f.writelines() # 对文件单行数据读取
在'a‘追加写模式下,不会覆盖原来的数据,在文本文件信息末尾出追加,进行写操作。
在这三种模式下还有可读可写模式'r+t', 'w+t' 和 'a+t’模式。
在读模式下,使用f.read(1),在内置函数read()内可以放置int型参数。这个参数表读取位置的参数。在'rt‘模式下,存入的方式是以'utf-8',我们可以读取文本文件的第1个汉字或字母。这就是实现对文件的选择性读取了。
# a.txt文件内容 商品 价格 mac 8600 iphone 8900 联想电脑 5200 玩具 364 # 文件的第一字是商 # py文件读程序 with open(r'a.txt', 'rt', encoding='utf-8') as f: rec = f.read(1) # 读取第一个字 print(rec) >>>商 # 当read()参数改为2时 >>>商品
选择型读取还有以seek()的内置函数需要了解。写f.seek(),我们使用ctrl键鼠标放在seek上发现这里需要放置两个参数f.seek(offset, whence)。offset代表的是指针移动的字节数,whence是代表参照什么位置移动的。当whence = 0,表示在文件开头,并且在t和b模式下都可以使用。whence = 1,表示参照当前所在位置,必须在b模式下使用。whence = 2 ,表示参照末尾,也必须在b模式下使用。
# a.txt文档,在gbk模式下存入的 meKing在学习还是在把妹 # py文件 with open(r'a.txt', 'rb') as f: f.seek(6, 1) # 在第六个Btes开始,每个英文字母占1Btes,中文字符占用2Btes rec = f.read(2).decode('gbk') # 读取2Btes,用gbk编码解码 print(rec) >>>在
whence=2时,的读取位置将在末尾。利用此功能可以做一文件检测的功能
# py写文件 import time A = time.strftime('%Y-%m-%d %X') print(A) with open(r'b.txt', 'a', encoding='utf-8') as f: f.write('%s meKing在学习 '%A) # 检测文件是否写入 with open(r'b.txt', 'rb') as f: f.seek(0, 2) # whence = 2模式。光标位置在b文件末尾 while True: s = f.readline() # 读取从之前末尾读往后一行 if s: # 如果有写入,便可以读取内容 print(f.tell()) # tell(),查光标位置 print("新增的文件内容:%s" % s.decode('utf-8'))
文件修改的两种方式
'''
方式一
1,先把原文件内容读出 2 ,对文件内容经行更改 3,把更改好的新内容写入,覆盖原文件 ''' with open(r'a.txt','r',encoding='utf-8') as f: a = f.read() # print(a) b = a.replace('女朋友', '玩具') # print(b) with open(r'a.txt', 'w', encoding='utf-8') as f1: f1.write(b) print('over')
''' 方式二 1,同时操作两个文件 2,将原文件的内容逐行读出经行修改,写入新文件内 3,完成后,删除原文件,将新文件名改成原文件名 ''' import os with open(r'a.txt', 'r', encoding='utf-8') as read_f, open(r'a1.txt', 'a', encoding='utf-8') as writre_f: #原文件读,新文件写操作 a = read_f.read() a = a.replace('女朋友', '玩具') # 修改文件内容 for line in a: new_line = line writre_f.write(new_line) # 逐行写入新文件 os.remove(r'a.txt') # 删除原文件 os.replace('a1.txt', 'a.txt') # 偷梁换柱,改成原文件名字