计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#找到文件 #打开文件,得到文件句柄并赋值给一个变量 #操作:读 写 #通过句柄对文件进行操作 # 关闭文件
文件的打开模式
文件句柄 = open('文件路径', '模式','编码方式')
模式可以是以下模式和他们之间的组合:
Character Meaning ‘r' open for reading (default) ‘w' open for writing, truncating the file first ‘a' open for writing, appending to the end of the file if it exists ‘b' binary mode ‘t' text mode (default) ‘+' open a disk file for updating (reading and writing) ‘U' universal newline mode (for backwards compatibility; should not be used in new code)
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 Files opened in binary mode (appending 'b' to the mode argument) return contents as bytes objects without any decoding. b是以二进制的形式来读文件,但是显示出来的却不是0101,而是以字节的形式显示出来。 一个字节是8位二进制,所以计算机是自动帮你进行了转换。 请不要误会b模式是按照字节读。
f = open('歌词','rb') content = f.read() f.close() print(content) f2 = open('歌词2','wb') f2.write(content) f2.close()
例子:
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
f = open('歌词','w',encoding='utf-8') #f:文件操作符 文件句柄 文件操作对象 f.write('7018201890') f.close()
#找到文件详解:文件与py的执行文件在相同路径下,直接用文件的名字就可以打开文件
#文件与py的执行文件不在相同路径下,用绝对路径找到文件
#文件的路径,需要用取消转译的方式来表示:1.\ 2.r''
#如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空
读文件的几种方式:
#打开文件 # f = open('歌词','r',encoding='utf-8') f = open('歌词',encoding='utf-8') #1.读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容 # content = f.read() # print('read : ',content) #2.读一部分内容:read(n),指定读n个单位 # print(f.read(5)) #3.读文件的第三种方式:按照行读,每次执行readline就会往下读一行 # content = f.readline()
# print('readline : ',content.strip()) #strip去掉空格、制表符、换行符
# content2 = f.readline()
# print(content2.strip())
#4.读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表
# content = f.readlines()
# print('readlines : ',content)
#5.读:最常用
for l in f:
print(l.strip())
#关闭文件 f.close()
文件怎么写:
文件怎么写
#write()
#write('第一行
')
#write('第二行
')
#write('第一行
第二行
')
# 1.会向文件中添加一行新内容
# 2.会读文件,并且将读出的内容格式化
# 3.会修改文件
只显示文件中有内容的行:
f = open('shoplist',encoding='utf-8') #只显示文件中有内容的行 goods_list = [] for line in f: if line.strip(): print(line.strip()) f.close()
应用:
1.读文件并整理成需要的数据类型,文件shoplist内容:每一行内容分别为商品名字,价钱,个数,
要求:
每一行输出一种商品的信息,(按照列表的格式)
最后把所有商品输出在同一个列表中:
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
f = open("shoplist", "r", encoding="utf-8") goods_list = [] goods_dic = {"name" : None,"price":None} for line in f: if line.strip(): good_list1 = line.split() print(good_list1) goods_dic["name"] = good_list1[0] goods_dic["price"] = good_list1[1] goods_list.append(goods_dic) print(goods_list) f.close()
输出:
['apple', '10', '3'] ['tesla', '100000', '1'] ['mac', '3000', '2'] ['lenovo', '30000', '3'] ['chicken', '10', '3'] [{'name': 'chicken', 'price': '10'}, {'name': 'chicken', 'price': '10'}, {'name': 'chicken', 'price': '10'}, {'name': 'chicken', 'price': '10'}, {'name': 'chicken', 'price': '10'}]
计算机打开一个文件的流程:
#1、由应用程序向操作系统发起系统调用open(...) #2、操作系统打开该文件,并返回一个文件句柄给应用程序 #3、应用程序将文件句柄赋值给变量f
关闭文件的注意事项:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()、
文件内的光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
f = open('歌词','r+',encoding='utf-8') #seek 光标移动到第几个字节的位置 # f.seek(0) 移动到最开始 # f.seek(0,2) 移动到最末尾
f.truncate(3) #从文件开始的位置只保留指定字节的内容 # f.write('我可写了啊')
#tell 告诉我光标在第几个字节 #seek移动光标到指定位置
# content = f.readline() # print(content.strip()) #tell告诉你当前光标所在的位置 # print(f.tell()) # f.seek(4) #光标移动到三个字节的地方‘ ’ # content = f.read(1) #读一个字符 # print('***',content,'***') # content = f.readline() # print(content.strip()) # print(f.tell()) f.close() #tell #seek:去最开始、去最结尾 #truncate:保留n个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
傻瓜式操作方式:使用with关键字来帮我们管理上下文:
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为: 1、f.close() #回收操作系统级打开的文件 2、del f #回收应用程序级的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源, 而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
#with操作文件 # f = open('原文件',encoding='utf-8') # content = f.read() # print(content) # f.close() # with open('原文件',encoding='utf-8') as f: # # content = f.read() # # print(content) # for line in f: # print(line.strip())
实例:
修改一个文件
with open('原文件',encoding='utf-8') as f,open('原文件.bak','w',encoding='utf-8') as f1: for line in f: new_line = line.replace('原来','新') f1.write(new_line) import os os.remove('原文件') os.rename('原文件.bak','原文件')
文件操作之修改:
#文件的修改 # #1.创建一个新文件 # f2 = open('原文件.bak','w',encoding='utf-8') # #2.把原来的文件中的内容读出来 # f = open('原文件',encoding='utf-8') # old_content = f.read() #'原来的内容 ' # #3.操作读出来的字符串,把字符串中的内容替换掉 # new_content = old_content.replace('新','原来') # #4.把替换之后的内容写到新文件里 # f2.write(new_content) # f.close() # f2.close() # # #5.删除原文件,新文件重命名成源文件的名字 # import os #os模块 # os.remove('原文件') #删除文件 # os.rename('原文件.bak','原文件') #重命名 #replace(‘老内容’,‘新内容’)
#文件的删除 # import os #os模块 # os.remove('原文件') #删除文件 # #1.创建一个新文件 # f2 = open('原文件.bak','w',encoding='utf-8') # #2.把原来的文件中的内容读出来 # f = open('原文件',encoding='utf-8') # for line in f: # new_line = line.replace('原来','新') # f2.write(new_line) # f.close() # f2.close() # import os # os.remove('原文件') # os.rename('原文件.bak','原文件') #进阶例子 # #1.创建一个新文件 # f2 = open('原文件.bak','w',encoding='utf-8') # #2.把原来的文件中的内容读出来 # f = open('原文件',encoding='utf-8') # count = 0 # for line in f: # if '原来' in line and count == 0: # new_line = line.replace('原来','新') # f2.write(new_line) # count = 1 # else: # f2.write(line) # f.close() # f2.close() # import os # os.remove('原文件') # os.rename('原文件.bak','原文件')