06-文件操作
对文件进行操作。
open()
打开一个文件。
该函数会得到一个文件对象的返回值,之后对文件进行读写操作都需要用这个文件对象。
该方法有多个参数需要注意:
file:文件路径。
mode:文件打开方式
buffering:设置缓冲。
encoding:编码,一般为utf-8。
errors:报错级别。
newline:区分换行符。
closefd:传入的file的参数类型。
其中,尤其需要注意的是 mode
参数,这个参数有多个值可选:
模式 描述
t 文本模式 (默认)。
x 写模式,新建一个文件,如果该文件已存在则会报错。
b 二进制模式。
+ 打开一个文件进行更新(可读可写)。
U 通用换行模式(Python 3 不支持)。
r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+ 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
但是常用的文件打开模式一般在还有r w a rb wb ab r+ w+ a+
。
f = open("test.txt", mode="r", encoding="utf-8")
fs = f.read()
print(fs) # 这样可以获取到文件中的内容,但是由于是只用r模式,所以只能读出文件中内容不能向文件中写入
文件对象方法:
file.read([size]):
读出文件中的全部内容。
该函数有一个可选参数,这个参数表示从文件中读取的字节数。如果给定了参数,那么就读取一定量的文件内容;如果没有给定参数,就是默认读取文件中的全部内容。
file.readline([size]):
逐行读取文件中的内容。
每次读取一行文件的内容 ,那么下一次再读取就是文件的第二行内容,已经被读取出来的文件不会被读取第二次。
每次只会读出文件中的一行内容,常用在如果文件内容特别多,文件很大的情况下是哟领,这样不会出现一下子读取全部的文件内容导致资源被占用。
file.readlines():
读取文件中的所有数据,并将文件中的全部数据存入一个列表进行返回。
返回的时候如果读取到的每一行文件内容如果有换行,会在数据末尾有一个\n。
注意:这三个方法都是对文件只读取一次,如果下次还想再重新读取文件内容,那就只能关闭文件从头开始读取了。
========================================================
f.write(info):
将内容写入文件。
f.close():
关闭已打开的文件。
每次对文件进行读写操作完毕之后,都需要关闭文件,否则会占用资源。
f.flush():
刷新缓冲区。直接将缓冲区中的内容直接写入文件中,而不是被动的等待输出缓冲区写入。
f.seek(offset[,whence]):
移动文件读取指针,用于从指定位置读取文件。
参数解析:
offset:开始的偏移量。表示需要移动偏移的字节数。如果该参数是负数,则代表从倒数第几位开始进行读写。
whence:该参数为可选参数,默认值为0。这是为了给offset参数定义一个参数u,表示要从那个位置开始偏移:0代表从文件开头开始偏移;1代表从当前指针位置开始偏移;2代表从文末开始偏移。
该函数如果操作成功,则返回新的文件位置;如果操作失败,则返回-1。
注意:传入的offsest参数,所代表的偏移量是从0开始计算的。也就是说如果传入5,那么是从文件的第6个字节数开始读取。
操作文件的进阶写法
with open("test.txt", mode="r", encoding="utf-8") as f:
fs = f.read()
print(fs)
使用这种方法,可以避免在读取文件完毕之后 还需要额外调用close()
方法来关闭文件。并且,一旦使用了这种形式来读写文件的话,那么在内部是可以使用循环来直接读取文件的:
with open("test.txt", mode="r", encoding="utf-8") as f:
for line in f:
print(line)
文件读写练习:
# 修改文件内容
"""
方法步骤:
①.首先引入os模块;
②.用r模式打开目标文件,并用w模式打开文件副本。(可以是任意一个文件)
③.从目标文件中读取文件内容,并写入副本中。
④.在副本中进行文件的修改。
⑤.删除目标文件,并将副本文件进行名字修改。
"""
import os
with open("素材.txt",mode="r",encoding="utf-8") as f,open("素材_副本.txt",mode="w",encoding="utf-8") as f2:
for line in f:
line = line.replace("明月","太阳")
f2.write(line)
os.remove("素材.txt")
os.rename("素材_副本.txt","素材.txt")
# 操作日志文件
list = []
with open("日志.log",mode="r",encoding="utf-8") as f:
first = f.readline().strip().split(",") # 将日志文件的第一行进行切割,得到一个列表:[id,name,company,country]
for line in f: # 从日志文件的光标处继续读取文件
dic = {} # 创建一个字典
lst = line.strip().split(",") # 将读取出来的内容再次进行切割,得到一个列表:[1,英雄联盟,拳头,韩国],[2,DNF,腾讯,中国],[3,反恐精英,Steam,美国]
for i in range(len(lst)): # 根据读取出来的列表的长度,进行循环,并以此创建字典的键值。
dic[first[i]] = lst[i]
list.append(dic) # 在最外层循环出,将每次创建的字典添加到空列表中
print(list)