一、文件处理流程
1、打开文件,得到文件句柄赋值给一个变量
2、通过句柄对文件进行操作
3、关闭文件
文件操作的格式: 变量 = open(‘路径’, ‘转码’, ‘模式’)
文件以什么方式存储就以什么编码方式打开,
对文件的操作只需呀记得 你打开 要找到文件的位置来打开 文件路径,编码,和要对文件进行的操作 ,然后找个变量来接收对文件操作的内容 然后再把文件关闭
小技巧: 当你使用readline读取文件后指针就会落到你readline的下一行 这个时候你再for文件只是把文件从readline后读取的
小习题:
文件内容: 序号 部门 人数 平均年龄 备注 1 python 30 26 单身狗 2 Linux 26 30 没对象 3 运营部 20 24 女生多 通过代码,将其构建成这种数据类型: [{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'}, ......] lis = [] with open('day8-04', encoding ='UTF-8',mode='r')as f: m = f.readline() #你readline读取后文件指针就会跑到你读取的后面了 n = m.split() for i in f: #这个时候你在遍历文件就会排除你readline的第一行了 dic ={} l = i.strip().split() for j in range(len(l)) : dic[n[j]] = l[j] lis.append(dic) print(lis)
读取:r
r模式读取模式有五种:
read ------->只读模式
readline------> 一行一行的读取文件
readlines ----->把文件的所有信息都显示在一行 并且是放在列表中的,同时放进去的同时还是有换行符 的
read(n)-------->是读取文件的第n个字符
还有就是循环读取 ,你read的时候循环把文件的每一行给调取出来 然后调取一行并且打印之后再释放掉 然后再调取下一行
r只读模式:
>>> f= open('F:测试.txt',encoding='UTF-8',mode='r') >>> m =f.read() >>> print(m) 去吃饭咋嫩饿 你就知道去吃 减减肥啊 >>> f.close
readline()------>把文件一行一行的打印出来:
>>> f = open('F:测试.txt',encoding="UTF-8",mode="r") >>> m =f.readline() >>> n = f.readline() >>> print(m, n) 去吃饭咋嫩饿 你就知道去吃 >>> print(m) 去吃饭咋嫩饿 >>> print(n) 你就知道去吃 >>> f.close() >>>
readlines()----->可以把所有的信息全部都打印在一行 并且加上换行符 一起显示的 然后再把所有的信息全部都放在一个列表中打印出来的
>>> f = open('F:测试.txt', encoding="UTF-8", mode="r") >>> m = f.readlines() #把所有的信息都打印在一行 是打印在一个列表中 >>> print(m) ['ufeff去吃饭咋嫩饿 ', '你就知道去吃 ', '减减肥啊'] >>> f.close() >>>
也可以在读取的时候限制读取多少个字符
f = open('F:测试.txt', encoding='UTF-8',mode='r') m = f.read(3) #这个里面的3代表的是读取的是3个字符 所以也只打印出三个字符 print(m) f.close()
也可以对readline 和readlines来操作:如果对readline来操作那么就和reada的意义和结果一样,但是readline的源码默认是取到-1的(这点我也不清楚)
f = open('测试', encoding='UTF-8',mode='r') m = f.readline(3) #只打印出三个字符 print(m) f.close()
而readlines就很有意义了 readlines也是默认取到-1的哪怕你就是括号内 输入无限大负数也会只是把所有的信息都在一行的显示出来 然后再根据其他的数字来根据第一行来定义
其实逐行读取打印的时候最有效率的方法是用循环读取:因为循环读取就是可以把所有的信息一行一行的调取到内存中显示之后释放掉 然后再调取下一行 然后再显示 再释放:
f = open('测试', encoding='UTF-8',mode='r') for i in f : print(i.strip()) f.close()
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 w+b
- ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
写的操作:write
write是对文件写入信息 但是首先先把这个文件清空 再写入您的要写的信息 并且如果没有这个文件那么就先创建这个文件再对文件进行写入
f = open('测试', encoding='UTF-8',mode='w') f.write('hhh') f.close()
与write对应的是a 就是mode上面是a然后就对应的是a就是追加的意思 只是再文件的信息后面追加你的信息
f = open('测试', encoding='UTF-8',mode='a') #看只是在这里把mode‘后面更改等于a就可以了 f.write('000') f.close()
只读模式rb:
f = open('F:测试.txt', mode='rb') count = f.read() print(count) f.close()
先读取再追加 r+:
f = open('F:测试.txt', encoding= "UTF-8",mode='r+') count = f.read() print(count) f.write('aaa') f.close()
三、上下文管理(其实就是r w的精化写法 就是不用再写close的方法,省的有些人忘记了)
wIth open('路径',encoding= "UTF-8", r/w) as f :
pass
with open("F:测试.txt",encoding="UTF-8", mode='r')as f : c= f.read() print(c)
with open('F:测试.txt',encoding= 'UTF-8',mode='w')as f: f.write('eee') count =f print(count)
with open('F:你.txt',encoding="UTF-8", mode ="r")as f, open("F:你.txt", encoding="UTF-8",mode="a") as f2: #如果同时操作多个文件的时候第一个文件后面是逗号隔开 content = f.read() new_content = f2.write('nihao') print(content) print(new_content) #write是返回的写入的字符
文件内光标移动:
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
seek()移动光标的位置 不论tell查找光标还是移动光标seek()都是按照字节来解决的
tell()顾名思义就是查找光标的位置
f = open('F:你.txt', encoding= "UTF-8",mode='r+') count = f.read() print(count) f.write('aaa') print(f.seek(3)) #把光标的位置移动到第三个字节 print(f.tell()) #读取当前的光标在哪里 也是按照字节来寻找 f.close()
因为seek是移动光标 但是这个移动光标和追加同时使用是没有效果的
因为a是追加 直接在后面追加了 使用seek没有用了
with open ("aa.text","a")as f: f.write("aaaaa") f.seek(3) # 把光标移动到位置3 但是是和a使用所以无效 f.write("bbbbb")
追加效果
每日作业:
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
li = [] all_money=0 with open ('第一题的需要',encoding = 'UTF-8', mode ='r')as f :#把这个文件的给全部读取出来 for i in f : # print(i) #字符串想转化为字典 先转化为列表再转化为字典 m = i.split() #这个时候你如果直接这样放进去的时候会是一直放再一个字典中 那么就直接定义字典的时候定义它的key dic={'name':m[0],'price':int(m[1]), 'amount':int(m[2])} # print(dic) #你要在列表中显示字典 那么就要把字典中的信息放进列表中 所以再定义一个列表接收字典 #这个列表和字典不一样 字典你要创建在循环中每次进来循环那就是一个新的 列表要创建在外面就让它一直只是一个列表 li.append(dic) # print(li) #我们可以让在循环的时候就把总资金加起来 每一次的循环就把价格给加一次 all_money +=dic['price']*dic['amount'] # all_money = li[0]['price']*li[0]['amount']+li[1]['price']*li[1]['amount']+li[2]['price']*li[2]['amount']+li[3]['price']*li[3]['amount']+li[4]['price']*li[4]['amount'] #这是蠢货的做法 print(li) print(all_money)
2,有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
import os #导入某块是为了你下面可以对文件进行删除和改名字
with open('a1',encoding='UTF-8', mode ='r')as f, open('a1.book',encoding = 'UTF-8',mode ='a')as f1 :#a是追加的内容 是让你可以进行内容的连续的追加
for i in f : #先把读取中的内容遍历出来
i=i.replace('alex','SB') #把i中的含有alex的内容全部遍历为sb
#因为你的i就是f中的全部内容就是一切把i中的所有内容给替换了
f1.write(i)
os.rename('a1.book','a1') #os模块运用rename来更改名字rite(i)
os.remove('a1')#这个是os模块 可以运用的remove删除文件名
3. 文件a1.txt内容:
文件内容:
name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013
通过代码,将其构建成这种数据类型:
[{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}......]
并计算出总价钱。
# 首先你是要要这些字符串发放进列表中的字典中 你先要放进字典中 ,先放进字典中就要先转化为列表 li1 =[] #创建一个把字符串转化为字典中的相互转化的中间物质列表 #第一你要把这个文件的内容给提取出来 all_money = 0 with open ('第三题的需要',encoding = 'UTF-8',mode= 'r')as f: for i in f : #把你所读取的文件中的所有的信息给遍历出来 看看都是什么好对文件进行操作 一般都是字符串 #写代码不是一撮而就的 就是慢慢的一点一点的测试 #你把你所要得到的信息给遍历出来后你就想着要对他们进行操作了 这个时候就要转化为列表 m=i.strip().split() #先把所有的信息都用空格给分割成列表 dic = {}# 建立一个字典然后把划分两次的元素形成的列表给添加进去 字典放在这里是为了让下面的循环中的信息每一次循环都添加进一新的字典 然后这个字典又不能放在最外面放在最外面每次信息都是加入就这一个字典中 但是我们是信息加入不同的字典中就要放入循环中 #这个时候你所转化为列表中的信息在列表中又是以冒号放在列表中的 所以我就要在划分一下 那么就要把列表中的信息给遍历出来 for j in m : # 你所遍历的信息是字符串类型的 你要放在字典中就要继续放在列表中再放入字典中 n =j.strip().split(':') #因为这些元素在列表中是以冒号连在一起的 那么我们就要继续分割 以冒号来分割 dic[n[0]]=n[1] li1.append(dic) #这个必须放在这里 添加因为是每一次把所有的信息都放入一个新字典中再添加进列表中 print(li1) #下面就是算出总价格 for i in li1 : #因为你的信息放在列表中的字典内 字典是无序的 你只能去遍历出来去算价格 all_money += int(i['price'])*int(i['amount']) print(all_money)
习题:
第一题:
1. 文件a.txt内容:每一行内容分别为商品名字,价钱,个数。
apple 10 3
tesla 100000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
通过代码,将其构建成这种数据类型:[{'name':'apple','price':10,'amount':3},{'name':'tesla','price':1000000,'amount':1}......] 并计算出总价钱。
name_list = ['name', 'price','amount'] l = [] with open('day8-01', encoding = 'UTF-8')as f: for i in f : l1 = i.strip().split() dic ={} for j in range(len(l1)): dic[name_list[j]] = l1[j] l.append(dic) print(l) #没有求价格 这个简单自己求
第二题:
2,有如下文件:
-------
alex是老男孩python发起人,创建人。
alex其实是人妖。
谁说alex是sb?
你们真逗,alex再牛逼,也掩饰不住资深屌丝的气质。
----------
将文件中所有的alex都替换成大写的SB。
import os #导入模块 with open('day8-02',encoding ='UTF-8',mode='r')as f, open('day8-02.bak',encoding ='UTF-8',mode='w')as f1 : for i in f: i = i.replace('SB','alex') f1.write(i) os.remove('day8-02') os.rename('day8-02.bak','day8-02')
第三题:
3. 文件a1.txt内容:
文件内容:
name:apple price:10 amount:3 year:2012
name:tesla price:100000 amount:1 year:2013
通过代码,将其构建成这种数据类型:
[{'name':'apple','price':10,'amount':3},
{'name':'tesla','price':1000000,'amount':1}......]
并计算出总价钱。
lis = [] with open('day8-03', encoding ='UTF-8', mode = 'r')as f: for i in f: l = i.strip().split() dic = {} #字典必须放在这 因为你放在最外围只是一个字典 放在这就是每一次都创建一个 for j in l: n = j.strip().split(':') dic[n[0]] =n[1] lis.append(dic) all_money = int(lis[0]['price'])*int(lis[0]['amount']) +int(lis[1]['price'])*int(lis[1]['amount']) print(lis) print(all_money)
第四题:
这一题运用到指针的位置了
文件内容:
序号 部门 人数 平均年龄 备注
1 python 30
26 单身狗
2 Linux 26
30 没对象
3 运营部 20
24 女生多
通过代码,将其构建成这种数据类型:
[{'序号':'1','部门':Python,'人数':30,'平均年龄':26,'备注':'单身狗'},
......]
lis = [] with open('day8-04', encoding ='UTF-8',mode='r')as f: m = f.readline() #你readline读取后文件指针就会跑到你读取的后面了 n = m.split() for i in f: #这个时候你在遍历文件就会排除你readline的第一行了 dic ={} l = i.strip().split() for j in range(len(l)) : dic[n[j]] = l[j] lis.append(dic) print(lis)