使用open(函数)来打开一个文件,获取到文件句柄(文件的标识,每一个文件都有本身独一无二的句柄)函数
open(文件名(或路径),mode='打开方式',encoding='字符集(如gbk)')动画
打开文件的方式:r,w,a,r+,w+,a+,rb,wb,ab,r+b,w+b,a+b.ui
读取完文件句柄必定要关闭 f.close()编码
1.spa
1 f=open('国家队',mode='r',encoding='utf-8') 2 s=f.read() 3 print(s) 4 f.close() 5 # 张继科景甜
6 # 贾乃亮
7 # 马龙
8 # 郭晶晶
9 # 田亮
10 # 叶一茜
11 # 倪妮
这里的encoding表示编码集,对大部分的人而言更多的是utf-8,与encode无关.code
打开方式是rb的时候,后面不能写encoding=''.blog
1 f=open('e:/153.jpg',mode='rb') 2 s=f.read() 3 print(s) 4 f.close() 5 # b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\x01,\x01,\x00\x00\xff\xe1\x00\xd4Exif\x00\x00MM\
rb读取的是非文本文件,是没法显示出来的,显示出来的是bytes类型.ip
2.绝对路径和相对路径内存
绝对路径:从磁盘根目录开始一直到文件名.utf-8
相对路径:若是在同一个文件夹中,相对路径就是这个文件名.若是在上一层文件夹,要用../
推荐使用相对路径.由于若是把程序拷贝给别人使用,绝对路径会有不少麻烦
3.读取文件的方法
3.1 read()是将文件中的内容所有读取出来,可是在实际操做中,尽可能不要用,由于若是文件过大,容易致使内存崩溃.
read(n)是读取n个字符,若是是rb模式,读取出来的是n个字节.若是再次读取,会从当前位置读,而不是从头读.
1 f=open('e:/153.jpg',mode='rb') 2 s=f.read(1) 3 print(s) #b'\xff'
4 a=f.read(1) #b'\xd8'
5 print(a) 6 f.close() 7
8
9 f=open('国家队',mode='r',encoding='utf-8') 10 s=f.read(1) 11 print(s) #张
12 a=f.read(1) 13 print(a) #继
14 f.close()
3.2 readline() 一次读取一行的数据.\n也会读出来,若是想去掉用strip()方法,同时readline()自带一个\n.
1 f=open('../day07/国家队',mode='r',encoding='utf-8') 2 content=f.readline().strip() 3 content1=f.readline().strip() 4 content2=f.readline().strip() 5 content3=f.readline().strip() 6 print(content) 7 print(content1) 8 print(content2) 9 print(content3)
张继科景甜
贾乃亮
马龙
郭晶晶
3.3 leadlines() 每一行做为一个字符串元素放到列表中,会将全部的内容读取出来,因此也容易出现内存奔溃的问题.
1 f=open('../day07/国家队',mode='r',encoding='utf-8') 2 lis=f.readlines() 3 print(lis) #['张继科景甜\n', '贾乃亮\n', '马龙\n', '郭晶晶\n', '田亮\n', '叶一茜\n', '倪妮']
3.4 循环读取.每次读取一行内容
1 f=open('../day07/国家队',mode='r',encoding='utf-8') 2 for line in f: 3 print(line.strip())
写入的时候,若是没有该文件,则会建立文件:
若是这个文件存在,则将原文件中的内容删除,在写入新内容(屡次使用f.write()只有第一次将原文件中的内容所有删除)
1 f=open('动画片.txt',mode='w',encoding='utf-8') 2 f.write('金毛狮王') 3 f.write('大耳朵图图') 4 f.write('小耳朵我') #金毛狮王大耳朵图图小耳朵我
5 f.flush() 6 f.close()
wb的模式下,写文件时,必须将字符串转换成utf-8的byte()数据.
1 f=open('动画片.txt',mode='wb') 2 f.write('他大舅'.encode('utf-8')) 3 f.flush() 4 f.close()
写入的内容会追加到文件的结尾
1 f=open('动画片.txt',mode='a') 2 f.write('qwert') #qwertqwert
3 f.flush() 4 f.close()
对于读写模式,必须是先读,而后再进行写入.不然会将开头的内容覆盖掉.,这里的write是追加,不会删除原文件.
1 f=open('动画片.txt',mode='r+',encoding='utf-8') 2 a=f.read() 3 print(a) #qwertqwertqwertyuiqwertyui是的法规
4 b=f.write('qwertyui是的法规') #这里的write是在原文件后追加,不是删除后再添加
5 f.flush() 6 f.close()
现将全部的内容清空,而后写入,最后读取,但读取的内容是空的.
1 f=open('动画片.txt',mode='w+',encoding='utf-8') 2 f.write('haha') #haha
3 content=f.read() #空
4 print(content) 5 f.flush() 6 f.close()
1 f=open('动画片.txt',mode='a+',encoding='utf-8') 2 f.write('刘的爱') #qwertykl刘的爱
3 content=f.read() #空
4 print(content) 5 f.flush() 6 f.close()
1. seek(n) 将光标移动到n位置,这里n的单位是byte,若是使用的是utf-8的中文,要是三的倍数.
移动到开头:seek(0)
移动到结尾:seek(0,2)
seek中的第二个参数表明从哪一个位置进行移动,0表示开头,1表示当前位置,2表示结尾.第一个参数表明偏移量.
2. tell() 能够帮助咱们获取当前光标的位置(单位是byte)
3. f.truncate() 删除光标后面的全部内容
★在r+模式下,光标无论用,若是读取了内容,无论光标是多少.再写入和操做的时候都是在结尾进行的
建立一个文件的副本,在副本中修改信息,修改完成后,将新文件的名字改为老文件的名字.
1 import os #引入os模块
2 with open('彩票.txt',mode='r',encoding='utf-8') as f1,open('彩票_new.txt',mode='w',encoding='utf-8') as f2: #另外一种打开方式
3 content=f1.read() 4 new_content=content.replace('疾病','健康') 5 f2.write(new_content) 6 os.remove('彩票.txt') #删除'彩票.txt'
7 os.rename('彩票_new.txt','彩票.txt') #重命名
以上 一次将全部的内容都读取了,内存容易奔溃,解决此问题的方案是能够一行一行的读取和操做:
1 import os 2 with open('彩票.txt',mode='r',encoding='utf-8') as f1,open('彩票_new.txt',mode='w',encoding='utf-8') as f2: 3 for line in f1: 4 new_line=line.replace('疾病','健康') 5 f2.write(new_line) 6 os.remove('彩票.txt') 7 os.rename('彩票_new.txt','彩票.txt')