目录
一.文件概述
依据数据的组织形式,文件可以分为两种类型:文本文件和二进制文件。
文本文件一般由特定的单一编码的字符组成,可通过文本编辑器进行创建,阅读和编辑。如txt文件,.py文件,hlmt文件。
二进制文件由比特0和比特1组成,以字节为单位的二进制数,二进制文件没有统一的字符编码。常见的形式有:“.png”为扩展名的图片文件,“.mp3”为扩展名的音频文件,“.mp4”为扩展名的视频文件。
文件操作的步骤:
打开文件,操作文件(读文件和写文件),关闭文件
二.打开文件
用open函数打开一个文件,返回一个文件对象
语法格式: open(file,mode = "r",encoding )
file :被打开的文件名(通常为文件路径,和代码在一个文件夹中可为文件名)
mode:文件打开的格式
文件打开的模式 “r” 只读模式,文件不存在则返回异常“FileNotFoundError” "w" 覆盖写模式,文件不存在则创建,存在则完全覆盖 "x" 创建写,文件不存在则创建,存在则返回异常“FileExistsError” "a" 追加写,文件不存在则创建,存在则在文件后面追加内容 "rt","wt","xt","at" 文本模式,默认值 "rb","wb","xb","ab" 二进制文件读写 "+",如 “r+”,“rb+” 与r/w/x/a/rb/...一起使用,在原功能上增加读写功能 encoding:Windows操作系统默认中文编码是“GBK”,如果文件中存在中文需要读取,则需使用编码"utf - 8",即encoding=“utf-8-sig”
f = open("hello.txt","r",encoding="utf-8-sig")
print(f)
运行结果:
用open函数打开一个文件,返回的是文件对象
文件的路径:一层一层目录构成的字符串,通过路径来表示某个文件的位置 ,知道了文件的路径,就可以知道文件在硬盘上的详细位置,也就可以进一步知道文件里面都有什么了。
相对路径:文件在硬盘上真正存在的路径,具有唯一性
绝对路径:指以当前所在目录为参考,查找其他文件或者目录的路径(可以理解为不给确切的位置,一点一点往上一级进行查找)
相对路径有关 单点(.) 表示当前目录 双点(..) 表示返回上一级 / 表示分隔目录 ../ 表示返回上一级 ../../ 表示向上返回两级 避免转义字符影响结果:
1.采用\\
2.采用/
3.在文件路径前加 “r”
在上面那个例子中,是将我们已知的文本文件和代码放在一起,所以可以直接在file的位置输入文件名称,但如果不在,一般要输入文件的路径。输入文件路径时,要注意转义字符的错误。如下:
f = open("D:\p\pycharm\text\静夜思.txt","r",encoding="utf-8-sig")
print(f)
在以上代码中,我们可以看到有例如 \t 的存在,会报如下错误:
如何解决转义字符的错误,有上文提到的三个办法:
#在转义字符中,\\表示的意思是\
f = open('D:\\p\\pycharm\\text\\静夜思.txt',"r",encoding="utf-8-sig")
print(f)
#采用反斜杠/
f = open('D:/p/pycharm/text/静夜思.txt',"r",encoding="utf-8-sig")
print(f)
#采用r或者R
f = open(R'D:\p\pycharm\text\静夜思.txt',"r",encoding="utf-8-sig")
print(f)
在上面运用到的是绝对路径,准确找到文件位置的路径。
采用任意一种方法的代码,均能得到如下运行结果。
三.关闭文件(with关键字)
文件在打开以后,使用完一定要关闭。打开文件是在申请一定的系统资源空间。当我们不再使用时,资源应当及时被释放,这就是正所谓“有借有还,再借不难”的道理了。如果我们不采取关闭文件的措施,可能会导致文件资源泄露,进一步导致其他代码无法顺利打开。同时,也应当了解到,一个程序能打开的文件数也是有限的。
#一个程序能打开的文件数是有限的
flist = []
count = 0
while True:
f = open("hello.txt","r",encoding="utf-8-sig")
flist.append(f)
count += 1
print(count)
运行结果:
如上,我们可以看出,一个程序能打开的文件数是有限的。当超过可以被打开的限度时,会报错。如果不放到我们上述定义的列表flist中,则不会报错。
文件关闭就十分重要。
语法格式:文件对象名.close()
f = open("hello.txt","r",encoding="utf-8-sig")
f.close()
close()方法不一定能保证文件正常关闭,如果程序出现异常导致close()方法没有执行,则文件将不会关闭。 此时,就不得不提到with关键字了。
with关键字语法格式:with open() as f :
采用with关键字后,不需要访问文件后再将其关闭,python会在合适时自动关闭。
#打开一个
with open("hello.txt","r",encoding="utf-8-sig") as f:
#打开两个
with open("hello.txt", "r") as f1,open("hh.txt", "r") as f2:
四.读文件
text文件的内容:
4.1 read()方法
默认读取全部字符。
语法格式:f.read()
#默认读取全部内容
with open("text.txt","r",encoding="utf-8-sig") as f:
print(f.read())
运行结果:
#读取前6个字符的内容
with open("text.txt","r",encoding="utf-8-sig") as f:
print(f.read(6))
运行结果:
4.2 readlines()方法
读取所有行,以每一行为元素形成一个列表。
语法格式:文件对象.readlines()
注意:readlines()一次性读取全部,占大量内存空间。
with open("text.txt","r",encoding="utf-8-sig") as f:
print(f.readlines())
运行结果:
当在括号内输入字符数时,数不够也是输入包括的那一行,按行输出,只要包含一个字符,就输出那一行所有文字。如下举例:
with open("text.txt","r",encoding="utf-8-sig") as f:
print(f.readlines(1))
with open("text.txt","r",encoding="utf-8-sig") as f:
print(f.readlines(6))
with open("text.txt", "r", encoding="utf-8-sig") as f:
print(f.readlines(8))
运行结果:
4.3 readline()方法
语法格式:文件对象.readline([size])
size参数可以省略,省略则会对文件进行逐行读取,传入则会读取前size长度的字符或字节。
with open("text.txt", "r", encoding="utf-8-sig") as f:
print(f.readline())
运行结果:
五.写文件
5.1 write()方法
语法格式:文件对象. write(s)
s:表示要写入的内容
我们电脑中不存在plan.txt这个文件,使用“w”进行覆盖写
with open("plan.txt", "w", encoding="utf-8-sig") as f:
f.write("1.今天要好好学习\n")
f.write("2.今天要锻炼身体\n")
运行结果:
我们可以在电脑中找到新生成的 plan.txt 文件,并在文件内部生成了我们write里面的内容。
5.2 writelines()方法
向文件中写入以字符串为元素的列表
语法格式:文件对象.writelines(lines)
list01 = ['111','222','333']
with open("plan.txt", "w", encoding="utf-8-sig") as f:
f.writelines(list01)
运行结果:
“w”是覆盖写,清空文件内容然后写入。
列表中各个字符串元素都写入文件中,元素之间无间隔。