四、文件操作与处理
一、文件处理介绍
1 什么是文件
文件是操作系统为用户/应用程序提供的一种操作硬盘的抽象单位
2 为何要用文件
用户/应用程序对文件的读写操作会由操作系统转换成具体的硬盘操作
所以用户/应用程序可以通过简单的读\写文件来间接地控制复杂的硬盘的存取操作
实现将内存中的数据永久保存到硬盘中
user=input('>>>>: ') #user="egon"
3 如何用文件
文件操作的基本步骤:
f=open(...) #打开文件,拿到一个文件对象f,f就相当于一个遥控器,可以向操作系统发送指令
f.read() # 读写文件,向操作系统发送读写文件指令
f.close() # 关闭文件,回收操作系统的资源
上下文管理:
with open(...) as f:
pass
#向操作系统发送请求,要求操作系统打开文件f=open(r'C:\Users\silence\PycharmProjects\day1\a.txt',encoding='utf-8')#f的值是一个文件对象print(f)print(f.read())#向操作系统发送请求,要求操作系统关闭打开的文件#强调:一定要在程序结束前关闭打开的文件f.close()
# 上下文管理with
withopen(r'C:\Users\silence\PycharmProjects\day1\a.txt','r',encoding='utf-8')asf:read=f.read()print(read)
# 字符串转密码
# 不能直接使用dict
1.py
withopen('a.txt','rt',encoding='utf-8')asf:auth=f.read()d=eval(auth)print(d,type(d))-----------------------------------{'name':'s_jun'}<class'dict'>
a.txt
{"name":"s_jun"}
二、文件操作
一 文件的打开模式
r: 只读模式L(默认的)
w: 只写模式
a: 只追加写模式
二 控制读写文件单位的方式(必须与r\w\a连用)
t : 文本模式(默认的),一定要指定encoding参数
优点: 操作系统会将硬盘中二进制数字解码成unicode然后返回
强调:只针对文本文件有效
b: 二进制模式,一定不能指定encoding参数
优点:
a.txt
{"name":"s_jun"}
1.py
withopen('a.txt',mode='rt',encoding='utf-8')asf:data=f.read()print(data,type(data))--------------------------------------------------{"name":"s_jun"}<class'str'>#图片二进制查看withopen('1.jpg',mode='rb',)asf:data=f.read()print(data,type(data))----------------------------------------b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01\x01\x01\......<class'bytes'>withopen('a.txt',mode='rb',)asf:data=f.read()print(data,type(data))print(data.decode('utf-8'))-----------------------------------b'{"name":"s_jun"}'<class'bytes'>{"name":"s_jun"}withopen('a.txt',mode='rt',encoding='utf-8')asf:data=f.read()print(data,type(data))----------------------------------------------{"name":"s_jun"}<class'str'>
# r: 只读模式L(默认的)
# 1 当文件不存时,会报错
# 2 当文件存在时,文件指针指向文件的开头
withopen('a.txt',mode='rt',encoding='utf-8')asf:res1=f.read()print('111===>',res1)res2=f.read()print('222===>',res2)print(f.read())print(f.readable())print(f.writable())print(f.readline())print(f.readline())forlineinf:print(line)l=[]forlineinf:l.append(line)print(l)print(f.readlines())-------------------------------------------111===>{"name":"s_jun"}222===>TrueFalse[][]
二 w: 只写模式
# 1 当文件不存时,新建一个空文档
# 2 当文件存在时,清空文件内容,文件指针跑到文件的开头
withopen('c.txt',mode='wt',encoding='utf-8')asf:print(f.readable())print(f.writable())f.write('你愁啥\n')f.write('瞅你咋地\n')f.write('1111\n2222\n333\n4444\n')info=['egon:123\n','alex:456\n','lxx:lxx123\n']forlineininfo:f.write(line)f.writelines(info)------------------------------------------FalseTrue
c.txt
你愁啥瞅你咋地111122223334444egon:123alex:456lxx:lxx123egon:123alex:456lxx:lxx123
withopen('c.txt',mode='rb')asf:print(f.read())withopen('c.txt',mode='wb')asf:f.write('哈哈哈\n'.encode('utf-8'))f.write('你愁啥\n'.encode('utf-8'))f.write('瞅你咋地\n'.encode('utf-8'))---------------------------------------------------b'\xe5\x93\x88\xe5\x93\x88\xe5\......'
c.txt
哈哈哈你愁啥瞅你咋地(\n,回车)
# 三 a: 只追加写模式
# 1 当文件不存时,新建一个空文档,文件指针跑到文件的末尾
# 2 当文件存在时,文件指针跑到文件的末尾
withopen('c.txt',mode='at',encoding='utf-8')asf:print(f.readable())print(f.writable())f.write('虎老师:123\n')----------------------------------------------------FalseTrue
c.txt
哈哈哈你愁啥瞅你咋地虎老师:123(\n,回车)
# 在文件打开不关闭的情况下,连续的写入,下一次写入一定是基于上一次写入指针的位置而继续的
withopen('d.txt',mode='wt',encoding='utf-8')asf:f.write('虎老师1:123\n')f.write('虎老师2:123\n')f.write('虎老师3:123\n')
d.txt
虎老师1:123虎老师2:123虎老师3:123(\n,回车)
-----------------------------------------------------------------------
withopen('d.txt',mode='wt',encoding='utf-8')asf:f.write('虎老师4:123\n')
d.txt
虎老师4:123(\n,回车)
---------------------------------------------------------------------------
withopen('d.txt',mode='at',encoding='utf-8')asf:f.write('虎老师1:123\n')f.write('虎老师2:123\n')f.write('虎老师3:123\n')
d.txt
虎老师4:123虎老师1:123虎老师2:123虎老师3:123
------------------------------------------
withopen('d.txt',mode='at',encoding='utf-8')asf:f.write('虎老师4:123\n')
d.txt
虎老师4:123虎老师1:123虎老师2:123虎老师3:123虎老师4:123(\n,回车)
工具代码:
类型Linux cp 工具
使用:
python .\copyTool.py a.txt aa.txt
#系统提供的模块现在用它来接收用户从cmd中输入的参数importsys#argv返回一个数组里面是cmd中接收的参数空格分隔print(sys.argv)src=sys.argv[1]dis=sys.argv[2]ifsrc==dis:print("源文件与目标文件相同再见")#以读取二进制的模式打开源文件srcf=open(src,"rb")#以写入二进制的模式打开目标文件disf=open(dis,"wb")#从源文件读取写入到目标文件forlineinsrcf:disf.write(line)#关闭资源srcf.close()disf.close()
登录注册购物车
users=[]#current_user当前用户current_user=""#注册用户whileTrue:name=input("请输入用户名:")#循环取出所有姓名对比tag=Trueforiinusers:ifi["name"]==name:print("用户名重复请重试:")tag=FalsebreakifFalse==tag:continuepassword=input("请输入密码:")confirm_password=input("请再次输入密码:")ifpassword!=confirm_password:print("两次密码不相同")continueelse:users.append({"name":name,"pwd":password})print("注册成功请登陆")current_user=namebreakname=input("请输入用户名:")pwd=input("请输入密码:")foruser_dicinusers:ifuser_dic["name"]==name:ifuser_dic["pwd"]==pwd:print("欢迎你:%s"%name)breakselect=input("""请选择:1.查看商品列表2.修改密码""")#商品列表product_list=[['Iphone7',5800],['Coffee',30],['疙瘩汤',10],['PythonBook',99],['Bike',199],['ViVoX9',2499],]#创建一个字典用于保存购物车数据product_dict={}ifselect=="1":whileTrue:foriinproduct_list:print("%d%s"%(product_list.index(i)+1,i))text=input("请输入序号:")iftext=="quit":breaknum=int(text)ifnum>0andnum<7:print("加入购物车")product=product_list[num-1]#如果商品已经存在购物车中就更新数量和价格否则加进去ifproduct[0]inproduct_dict:dict1=product_dict[product[0]]#更新价格dict1["price"]=dict1["price"]+product[1]#更新数量dict1["count"]=dict1["count"]+1else:product_dict[product[0]]={"name":product[0],"price":product[1],"count":1}else:print("序号不存在")elifselect=="2":tag1=Truewhiletag1:oldpwd=input("请输入旧密码:")foruinusers:ifu["name"]==current_user:ifoldpwd==u["pwd"]:newpwd=input("请输入新密码:")ifnewpwd=="quit":tag1=Falsebreaku["pwd"]=newpwdtag1=Falsebreakelse:print("旧密码不正确")print(users)else:print("输入错误:")print(product_dict)
冒泡排序
data=[3,2,1,4,5]#排序有两种顺序从大到小从小到大#从大到小#核心思想依次取出两个相邻元素比较大小如果是从大到小#aba<b如果前者小于后者就交换位置"""第一圈521344第二圈523413第三圈534212第四圈543211结论每一圈比较的次数是需要比较的元素个数减去1每一圈比较完毕后都会产生一个具备顺序的元素在下一圈比较的时候这个有顺序的元素就不用在比了比较的圈数为元素个数减1选择排序每次找出一个最大值放到列表的前面或后面"""#外层控制比较圈数foriinrange(len(data)-1):forjinrange(len(data)-1-i):ifdata[j]>data[j+1]:data[j],data[j+1]=data[j+1],data[j]print(data)
三级菜单
menu={"中国":{"湖北":{"武汉":{"A":{},"B":{},"C":{},},},},"山西":{"太原":{"xx区":{"1":{},"2":{},"3":{},},},},"青铜":{"黄金":{"王者":{"x":{},"y":{},"z":{},},},},}tag=Truewhiletag:menu1=menuforkinmenu1:print(k)choice1=input("一:").strip()ifchoice1=='b':breakifchoice1=='q':tag=Falseifchoice1notinmenu1:continuewhiletag:menu2=menu1[choice1]forkeyinmenu2:print(key)choice2=input("二:").strip()ifchoice2=="b":breakifchoice2=='q':tag=Falseifchoice2notinmenu2:continuewhiletag:menu3=menu2[choice2]forkeyinmenu3:print(key)choice3=input("三:").strip()ifchoice3=='b':breakifchoice3=='q':tag=Falseifchoice3notinmenu3:continuewhiletag:menu4=menu3[choice3]forkinmenu4:print(k)choice4=input("四:").strip()ifchoice4=='b':breakifchoice4=="q":tag=Falseifchoice4notinmenu4:continue
金字塔
n=5forcinrange(1,n+1):foriinrange(n-c):print('',end='')forjinrange(2*c-1):print('*',end='')print()
n=1whilen<=8:print(('x'*n).center(17,''))n+=2
n=1foriinrange(0,10):ifi%2==1:print(("x"*i).center(20,''))
99乘法口诀表
foriinrange(1,10):forjinrange(1,i+1):print("{}*{}={}\t".format(i,j,i*j),end="")print()
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。