一,文件操作流程
1,打开文件
f = open("歌词","w",encoding = "utf-8") #默认打开方式为读"r"。
打开文件操作f = open("歌词","w",encoding = "utf-8")分析:
1、由应用程序向操作系统发起系统调用open
2、操作系统打开该文件,并返回一个文件句柄给应用程序
3、应用程序将文件句柄赋值给变量f
2,通过文件操作符对文件进行操作
f = f.write() #f叫文件操作符(文件句柄,文件操作对象),习惯叫f,file,fh...
3,关闭文件
f.close()
print(f.writable()) #判断文件是否可写
print(f.readable()) #判断文件是否可读
f.write("23948749") #写文件需要写数字的时候,需要将数字转化为字符串
f.write("\nasdfg") #\n文件的换行
*****找到文件详解*****
1,文件与py的执行文件在相同路径下,直接用文件名字就可以打开文件
文件与py的执行文件在不同路径下,用绝对路径找到找到文件
2,文件的路径,需要用取消转译的方式来表示:1:\\ 2:r" "
3,如果以写文件的方式打开一个文件,那么不存在的文件将被创建,存在的文件之前的内容会被清空
*****关闭文件详解*****
关闭文件的方法:
1、f.close() #操作系统级的关闭文件
2、del f #释放一个python程序内存中的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源
一个python程序内存中的变量在内存中会自动释放,所以del f可写可不写,在操作文件完后,一定要记住f.close()
二,文件编码:
f=open(...)是由操作系统打开文件,那么如果我们没有为open指定编码,操作系统用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8。
如f=open('歌词','w',encoding='utf-8')
三,文件的打开模式
f = open("文件路径",操作模式,编码)
f = open("歌词","r",encoding = "utf-8")
读文件的几种方式:
1,read方法,用此方法会一次性的读出文件中的所有内容
content = f.read()
print(content)
2,read(n),读一部分内容,指定读n个单位
print(f.read(5))
3,按照行读,每次执行readline就会往下读一行
content = f.readline()
print(content.strip()) #strip去掉空格、制表符、换行符
content2 = f.readline()
print(content2.strip())
print(1) #--> 1\n输出最后自动有换行符\n
print('1\n') #--> 1\n\n
4,readlines,将文件中的每一行作为列表中的每一项并返回一个列表
content = f.readlines()
print(content)
5,最常用的读方法
for l in f:
print(l,strip())
练习1:有如下购物单:读文件并将它整理成字典类型
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
f = open('shoplist',encoding='utf-8')
goods_list = []
for line in f:
if line.strip():
goods_dic = {'name':None,'price':None}
line = line.strip()
goods_lst = line.split()
goods_dic['name'] = goods_lst[0]
goods_dic['price'] = goods_lst[1]
goods_list.append(goods_dic)
print(goods_list)
f.close()
结果为[{'name': 'apple', 'price': '10'}, {'name': 'tesla', 'price': '100000'}, {'name': 'mac', 'price': '3000'}, {'name': 'lenovo', 'price': '30000'}, {'name': 'chicken', 'price': '10'}]
练习2:只显示文件中有内容的行
f = open('shoplist',encoding='utf-8')
goods_list = []
for line in f:
if line.strip():
print(line.strip())
f.close()
三,打开文件的几种模式
1.对于文本文件
r ,只读模式:默认模式,文件必须存在,不存在则抛出异常
w,只写模式:不可读;不存在则创建;存在则清空内容
a, 之追加写模式:不可读;不存在则创建;存在则只追加内容
2.使用b模式,"b"表示以字节的方式操作,主要用于:
图片文件,音乐,视频文件
文件传输:上传,下载
网络编程
#修改文件的编码——非常不重要,不重要程度五颗星
#utf-8 用utf8的方式打开一个文件
#读文件里的内容str
#将读出来的内容转换成gbk
#以gbk的方式打开另一个文件
#写入
rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
a+:写读[可读可写]追加可读
f = open('歌词','a+',encoding='utf-8')
f.write('\nqq星')
f.seek(0)
print(f.read())
f.close()
r+:读写[可读可写]先读后写,写是追写;先写后读,从头开始写
w+:写读[可写可读]一上来文件就清空了,尽管可读,但是读出来的内容是你这次打开文件新写入的;光标在最后,需要主动移动光标才可读。
f = open('歌词','w+',encoding='utf-8')
f.write('abc\n')
f.write('及哈哈哈')
f.seek(0)
print(f.read())
f.close()
一般情况下:文件操作,要么读,要么写,很少会用到读写、写读同时用的
#常用的操作方式:
r、w、a
rb、wb、ab
文件内的光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek,光标移动到第几个字节的位置,有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
f.seek(0)移动到最开始
f.seek(0,2)移动到最末尾
2. truncate是从文件开始位置只保留指定字节的内容,文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
f.truncate(3)
3.tell告诉我光标在第几个字节
print(f.tell())
四,文件的修改
1,创建一个新文件
f2 = open("原文件.bak","w",encoding = "utf-8")
2,把原来文件中的内容读出来
f = open("原文件",encoding = "utf-8")
old_content = f.read() #"原来的内容\n"
3,操作读出来的字符串,把字符串中的内容替换掉
new_content = old_content.raplace("新","原来")
4,把替换之后的内容写到新文件里
f2.write(new_content)
f.close()
f2.close()
5,删除原文件,新文件重命名成原文件的名字
import os #os模块
os.remove("原文件") #删除文件
os.rename("原文件.bak","原文件") #重命名 #replace("老内容","新内容")
###文件的删除
import os
os.remove("原文件")
文件的修改常用的方法是用for循环
f2 = open("原文件.bak","w",encoding = "utf-8")
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","原文件")
进阶例子:只替换第一个
f2 = open('原文件.bak','w',encoding='utf-8')
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','原文件')
##with操作文件,针对很多时候回忘记写f.close()关闭文件
常规写法:
f = open("原文件",encoding = "utf-8")
content = f.read()
print(content)
f.close()
with操作写法:
with open("原文件",encoding = "utf-8") as f:
content = f.read()
print(content)
for line in f:
print(line.strip())
多个文件with操作:
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','原文件')