python第八天
1 文件的初识
#1. 打开文件,得到文件句柄并赋值给一个变量
f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r
#2. 通过句柄对文件进行操作
data=f.read()
#3. 关闭文件
f.close()
错误的处理
解决方式一: 'C:\\Users\金鑫\Desktop\\111.txt' 凡是路径会发生化学反应的地方,多加一个\ 这样就是前面\对后面的\进行转译,告诉计算机这个只是想单纯的表示\路径而已。
解决方式二: r'C:\\Users\金鑫\Desktop\\111.txt' 在路径的整体前面加一个r。(推荐)
相对路径与绝对路径:
1.绝对路径:从磁盘根目录开始一直到文件名
2.相对路径:用一个文件夹下的文件,相对于当前这个程序所在的文件而言.如果在同一个文件中,则相对路劲就是这个文件名.如果再上一层文件夹则要使用../相对路径下,你就可以直接写文件名即可。
2文件的读
r 模式
以只读方式打开文件,文件的指针将会放在文件的开头。是文件操作最常用的模式,也是默认模式,如果一个文件不设置mode,那么默认使用r模式操作文件。
举例说明:
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)
结果:
高圆圆
刘亦菲
张柏芝
杨紫
王菲
通过上面的例子可以看出来,我将小娃娃这个文件的内容全部读取出来了,那么读一个文件还可以怎么读取呢?下面我们研究一下不同的读文件的方法。
2.1.1 read()
read()将文件中的内容全部读取出来;弊端 如果文件很大就会非常的占用内存,容易导致内存奔溃.
= open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read()
f.close()
print(msg)
结果:
高圆圆
刘亦菲
张柏芝
杨紫
王菲
2.1.2 read(n)
read()读取的时候指定读取到什么位置
在r模式下,n按照字符读取。
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg = f.read(3)
msg1 = f.read()
f.close()
print(msg)
print(msg1)
结果:
高圆圆
刘亦菲
张柏芝
杨紫
王菲
2.1.3 readline()
readline()读取每次只读取一行,注意点:readline()读取出来的数据在后面都有一个\n
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline()
msg2 = f.readline()
msg3 = f.readline()
msg4 = f.readline()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
结果:
高圆圆
刘亦菲
张柏芝
杨紫
解决这个问题只需要在我们读取出来的文件后边加一个strip()就OK了
f = open('path1/小娃娃.txt',mode='r',encoding='utf-8')
msg1 = f.readline().strip()
msg2 = f.readline().strip()
msg3 = f.readline().strip()
msg4 = f.readline().strip()
f.close()
print(msg1)
print(msg2)
print(msg3)
print(msg4)
结果:
高圆圆
刘亦菲
张柏芝
杨紫
2.1.4 readlines()
readlines() 返回一个列表,列表里面每个元素是原文件的每一行,如果文件很大,占内存,容易崩盘。
f = open('log',encoding='utf-8')
print(f.readlines())
f.close()
# 结果['666666\n', 'fkja l;\n', 'fdkslfaj\n', 'dfsflj\n', 'df;asdlf\n', '\n', ]
2.1.5 for循环
可以通过for循环去读取,文件句柄是一个迭代器,他的特点就是每次循环只在内存中占一行的数据,非常节省内存。
f = open('../path1/弟子规',mode='r',encoding='utf-8')
for line in f:
print(line) #这种方式就是在一行一行的进行读取,它就执行了下边的功能
print(f.readline())
print(f.readline())
print(f.readline())
print(f.readline())
f.close()
import os
with open('E:\剑来',encoding='utf_8') as f,\
open('E:\剑来,bak',encoding='utf-8',mode='w') as f1:
old_content=f.read()
new_content=old_content.replace('徐凤年','sb')
f1.write(new_content)
os.remove('E:\剑来')
os.rename('E:\剑来,bak','E:\剑来')
进阶版
import os
with open('E:\剑来',encoding='utf_8') as f,\
open('E:\剑来,bak',encoding='utf-8',mode='w') as f1:
for line in f:
new_line=line.replace('sb','徐凤年')
f1.write(new_line)
os.remove('E:\剑来')
os.rename('E:\剑来,bak','E:\剑来')
有关清空的问题
关闭文件的句柄 再次以w模式打开此文件时,才会清空
作业:
#利用Python代码构建一个这样的列表
# l=[]
#
# for i in range(3):
#
# l.append(['_']*3)
#
# print(l)[['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
方法二
print([['_']*3]*3)
判断是否为水仙花数字:153=1**3+5**3+3**3
num=input('qingshuru:')
count=0
if num.isdecimal():
for i in num:
count=count+int(i)**3
if count==int(num):
print('shi')
else:
print('cuo')
else:
print('qingchongxinshuru:')
注意:列表的删除是倒序删
lst=['周老二','周星星','麻花腾','周扒皮']#结果lst=['麻花腾']
for i in range (len(lst)-1,-1,-1):
if lst[i].strip()[0]=='周':
lst.pop(i)
print(lst)
#结果:{'黑龙江:2','山东':1,'北京':1}
cars=['鲁A32444','鲁B12333','京B8989M','黑C49678','黑C46555','沪B25041']
locals={'沪':'上海','黑':'黑龙江','鲁':'山东','京':'北京'}
#方法一
# dic={}
# for i in cars:
# if locals[i[0]] not in dic:
# dic[locals[i[0]]]=1
# else:
# dic[locals[i[0]]]+=1
#print(dic)
#方法二
# dic={}
# for i in cars:
# dic[locals[i[0]]]=dic.get(locals[i[0]],0)+1
# print(dic)
with open('金刚葫芦娃',encoding='utf-8',mode='a+') as f:
f.write('hehe')#文件最后追加写入
f.seek(0)#光标调到最前
f.seek(0,2)#光标调到最后
content=f.read()#全部读出
print(content[:-4])#删除最后4个字符
多看几遍 一定要会了
l1=[]
name_list=[]
with open('a.txt',encoding='utf-8') as f1:
for line in f1:
line_list=line.strip().split()
dic = {}
for index in range(len(name_list)):\
dic[name_list[index]]=line_list[index]
l1.append(dic)
print(l1)

浙公网安备 33010602011771号