基础解释
在 Python 中,文件操作的模式除了 w (只写)、 a (追加写)、 r (只读)外,还有以下几种常见模式:
- r+ :可读可写。该文件必须已存在,写操作是追加在文件内容末尾。若先读后写,写入时是从文本最后面开始追加;若先写后读,从文本开头写入时会覆盖对应个数的字符。
- w+ :写读模式。打开创建新文件并写入数据,如果文件已存在,则覆盖写。无论是先写后读还是先读后写,刚打开文件时读取内容都为空,因为写入操作会清空原内容。若要读取完整内容,需将光标移到首位,可使用 f.seek(0) 方法。
- a+ :追加读写模式。打开文件的方式与写入方式和 a 一样,如果文件不存在则创建新文件,不会清空原内容,写入内容会追加在文件末尾。但刚用 a+ 打开一个文件时,一般不能直接读取,因为此时光标在文件末尾,除非把光标移动到初始位置或任意非末尾的位置,可使用 seek() 方法解决。
- rb :以二进制方式读取文件。该文件必须已存在。
- wb :表示以二进制写方式打开,只能写文件,如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
- ab :以二进制追加模式打开,若文件不存在则创建新文件,用于以二进制形式在文件末尾追加数据。
总结来说,这些模式可以分为三大类:读 r (read)、写 w (write)、追加 a (append),后面加 b 表示以二进制形式操作文件,加 + 表示可读可写。
文件写入
示例代码:写入列表和直接写入文字不一样
def my_write(s):file=open("a.txt","a",encoding="utf-8")file.write(s)file.write('\n')file.close()
def my_write_lst(file,lst):f=open(file,"w",encoding="utf-8")f.writelines(lst)f.close()
if __name__ == '__main__':my_write("伟大的航天梦")my_write("北京欢迎你")lst=["姓名\t","年龄\n","张三\t","18\t"]#只能为字符串my_write_lst("c.txt",lst)
代码结果:
并不是都是,为了方便都截图了,找到自己创建的文件,open是打开,在文件不存在时会自动创建,点开文件查看结果即可。
文件的读取操作
示例代码:
def write_read(filename):file=open("d.txt","w+",encoding="utf-8")file.write("你好啊")#写入完成,文件的指针在最后#seek 修改文件指针的位置file.seek(0)# s=file.read()#读取全部内容# s=file.read(1)#读取一个字符# s=file.readline()#读取一行# s=file.readline(1)#读取一行的几个字符# s=file.readlines()#一行为一个列表的元素,返回值为列表#读取“好啊”,要移动指针的位置file.seek(3)#3表示三个字节,utf-8一个中文3个字节s=file.read()print(type(s),s)file.close()
if __name__ == '__main__':write_read("d.txt")
代码结果:先写入
文件的复制
示例代码:两个路径
def copy(src,new_file):#打开原文件file1=open(src,"rb")#rb为按二进制读取#打开目标文件file2=open(new_file,"wb")#边读边写s=file1.read()file2.write(s)file2.close()file1.close()#先打开的后关,后打开的先关
if __name__ == '__main__':src="./百度.png"#.代表的是当前目录new_file="../第十章/copy_百度.png"#两个点表示上级目录,相当于Windows的后退copy(src,new_file)print("复制完成")
代码结果:
admin是一个包,没有关系。
with语句
示例代码:简化读写代码过程,自动关闭文件
def write_fun():with open("aa.txt","w",encoding="utf-8") as file:file.write("北京欢迎你")
def read_fum():with open("aa.txt","r",encoding="utf-8") as file:print(file.read())
def copy(src,target):with open(src,"r",encoding="utf-8") as file1:with open(target,"w",encoding="utf-8") as file2:file2.write(file1.read())
if __name__ == '__main__':write_fun()read_fum()copy("./aa.txt","./dd.txt")
效果和前面差不多,就就不展示了,方便很多。
一维和二维数据的储存和读取
示例代码:
#一维数组的存储
def write_list():#一维数据,可以是集合,元组,列表lst=["陈俊宇","李佳怡","李静怡","蔡健雅"]with open("一维.txt","w",encoding="utf-8") as file:file.write(",".join(lst))
def read_list():with open("一维.txt","r",encoding="utf-8") as file:s=file.read()lst=s.split(",")print(lst)
def write_list2():lst=[["姓名","学号","排名"],["李静怡","001","12"],["蔡健雅","002","13"]]with open("二维.txt","w",encoding="utf-8") as file:for item in lst:line=",".join(item)file.write(line)file.write("\n")
def read_list2():data=[]with open("二维.txt","r",encoding="utf-8") as file:lst=file.readlines()#每一行的元素为一个列表for item in lst:new_lst=item[:len(item)-1].split(",")data.append(new_lst)print(data)
if __name__ == '__main__':write_list()read_list()write_list2()read_list2()
代码结果:先写入后读取
多维数据的存储和读取
示例代码:
import json
#准备高维数据
lst=[{"lys":10,"cxx":20},{"lsk":20,"skk":55},{"lsl":55,"jsh":44},{"ksk":44,"skp":55}
]
s=json.dumps(lst,ensure_ascii=False,indent=4)#ensure_ascii使其正常显示中文,indent可以增加缩进,美观
print(type(s))#编码
print(s)#编码 list>str,原本是字典
#解码
lst2=json.loads(s)
print(type(lst2))
print(lst2)
print()
#编码到文件中
with open("多维数据.txt","w+",encoding="utf-8") as file:json.dump(lst,file,ensure_ascii=False,indent=4)
with open("多维数据.txt","r",encoding="utf-8") as file:lst3=json.load(file)print(lst3)
代码结果:解码和读取出来的结果是一样的,是列表,但是编码数据类型是字符串,显示出来是列表的样式。
<class 'str'>
[
{
"lys": 10,
"cxx": 20
},
{
"lsk": 20,
"skk": 55
},
{
"lsl": 55,
"jsh": 44
},
{
"ksk": 44,
"skp": 55
}
]
<class 'list'>
[{'lys': 10, 'cxx': 20}, {'lsk': 20, 'skk': 55}, {'lsl': 55, 'jsh': 44}, {'ksk': 44, 'skp': 55}]
[{'lys': 10, 'cxx': 20}, {'lsk': 20, 'skk': 55}, {'lsl': 55, 'jsh': 44}, {'ksk': 44, 'skp': 55}]