首页 > 代码库 > python15-day03 文件的基本操作
python15-day03 文件的基本操作
1. 字典
1.1 字典的定义
字典是key-value结构
key的定义规则:
1. 必须是不可变的,数字、字符串、元组是不可变的,列表和字典中的元素是可变的,可hash的类型可以作为字典的key,不可hash的不可以作为字典key值。
dic1 = {1:"liangkai"} dic2 = {"name":"liangkai"} dic3 = {(1,2,3):"liangkai"} print(dic1.get(1)) print(dic2.get("name")) print(dic3.get((1,2,3)))
key值可以是数字、字符串、元组,取值时,key是什么形式就取什么形式。
2. 唯一性
key值是唯一的,如果一个字典有多个key值,执行程序不会报错,但是取值时只会返回一个value值。
value的定义规则:
1. 可以是任意类型数据
1.2 字典的操作
1.2.1 增删改查
#字典定义方法
dic = { ‘name‘:‘liangkai‘, ‘age‘:‘26‘ } dic1 = dict(‘name‘,"liangkai") print(dic1) dic2 = dict((‘name‘,‘liangkai‘),("age","18")) print(dic2)
#增,字典是无序的,key值是唯一的
dic["genger"] = ‘female‘ print(dic)
#删
del dic["name"] print(dic)
#改,key值是无法更改的
dic[‘name‘] = ‘kaige‘ print(dic)
#查,可以使用中括号的方法,或者get方法,get方法不会出现报错,如果没有key,会返回none
print(dic[‘name‘]) print(dic.get(‘name‘))
1.2.2 字典内置方法
#快速生成字典,同一个value值,不同的key,这样的key值指向同一块内存地址,一个改全改
dic1 = dict.fromkeys(["liangkai","kaige"],1) print(dic1)
#将每一项改成元组,以列表的形式输出
print(dic1.items()) for k,v in dic1.items(): prin(k,v)
#把所有的key以列表的形式输出,可以循环key值,打印value值
print(dic1.keys()) for i in dic1.keys(): print(i,dic1[i])
#把所有的value值以列表的形式输出
for i in dic1.values(): print(i)
#删除某个key-value对,key值必须存在,否则删除报错
#dic1.pop()
#随机删除某个键值对
dic1.popitem() #插入一个键值对 dic1.setdefault("sex","fomale") print(dic1) dic1.setdefault("name",[]).append(‘kaige‘) print(dic1)
#两个字典的更新,结合,存在则更新,不存在则创建
dic1.update() dic1.update(name= "kai") print(dic1)
#复制,浅copy,只能copy第一层
dic1.copy()
#深copy,导入copy模块
dic3 = copy.deepcopy(dic1) print(dic3)
1.3 三级菜单
1.3.1 简单逻辑版
# _*_ coding:utf-8 _*_ # Author :kaige menu = { ‘北京‘:{ ‘海淀‘:{ ‘五道口‘:{ ‘soho‘:{}, ‘网易‘:{}, ‘google‘:{} }, ‘中关村‘:{ ‘爱奇艺‘:{}, ‘汽车之家‘:{}, ‘youku‘:{}, }, ‘上地‘:{ ‘百度‘:{}, }, }, ‘昌平‘:{ ‘沙河‘:{ ‘老男孩‘:{}, ‘北航‘:{}, }, ‘天通苑‘:{}, ‘回龙观‘:{}, }, ‘朝阳‘:{}, ‘东城‘:{}, }, ‘上海‘:{ ‘闵行‘:{ "人民广场":{ ‘炸鸡店‘:{} } }, ‘闸北‘:{ ‘火车战‘:{ ‘携程‘:{} } }, ‘浦东‘:{}, }, ‘山东‘:{}, } while True: for n in menu: print(n) name_level1 = input("请输入一级城市名称:") if name_level1 == "quit": exit() elif name_level1 == "b": break elif name_level1 not in menu : print("输入不存在,请重新输入") continue else: while True: for n in menu[name_level1]: print(n) name_level2 = input("请输入二级城市名称:") if name_level2 == "quit": exit() elif name_level2 == "b": break elif name_level2 not in menu[name_level1] : print("输入不存在,请重新输入") continue else: while True: for n in menu[name_level1][name_level2]: print(n) name_level3 = input("请输入三级城市名称:") if name_level3 == "q": exit() elif name_level3 == "b": break elif name_level3 in menu[name_level1][name_level2]: for n in menu[name_level1][name_level2][name_level3]: print(n) else: print("输入不存在,请重新输入") continue while True: choice = input("请选择操作,b返回上一级,q退出") if choice == "q": exit() elif choice == "b": break else: print("输入错误,请重新输入") continue
1.3.2 优化版
# _*_ coding:utf-8 _*_ # Author :kaige menu = { ‘北京‘:{ ‘海淀‘:{ ‘五道口‘:{ ‘soho‘:{}, ‘网易‘:{}, ‘google‘:{} }, ‘中关村‘:{ ‘爱奇艺‘:{}, ‘汽车之家‘:{}, ‘youku‘:{}, }, ‘上地‘:{ ‘百度‘:{}, }, }, ‘昌平‘:{ ‘沙河‘:{ ‘老男孩‘:{}, ‘北航‘:{}, }, ‘天通苑‘:{}, ‘回龙观‘:{}, }, ‘朝阳‘:{}, ‘东城‘:{}, }, ‘上海‘:{ ‘闵行‘:{ "人民广场":{ ‘炸鸡店‘:{} } }, ‘闸北‘:{ ‘火车战‘:{ ‘携程‘:{} } }, ‘浦东‘:{}, }, ‘山东‘:{}, } last_level = [] menu_choice = menu while True: for key in menu_choice: print(key) choice = input(">>>>:") if choice == "b": if len(last_level) == 0: break menu_choice = last_level[-1] last_level.pop() elif choice == "q": exit("退出成功") elif choice not in menu_choice: print("输入不存在,请重新输入") continue else: last_level.append(menu_choice) menu_choice = menu_choice[choice]
2. 集合
定义:有不同元素组成的集合
2.1 基本操作
set1 = {1,2,5,7,8,4,10} set2 = {2,4,6,8,10} set3 = {6,8} #交集 print(set1.intersection(set2)) #并集 print(set1.union(set2)) #差集 print(set1.difference(set2)) print(set2.difference(set1)) #对称差集 print(set1.symmetric_difference(set2)) print(set2.symmetric_difference(set1)) #子集 print(set3.issubset(set2)) #父集 print(set2.issuperset(set3))
去掉交集部分,剩下的元素
2.2 集合内置方法
s1 ={1,2,3,4} s2 = {"a","b","c",2,4} #更新 s1.update(s2) print(s1) #增加 s1.add("hello") print(s1) #随机删除 print(s1.pop()) print(s1) #指定删除,如果元素不存在,返回错误 s1.remove("hello") print(s1) #第二种删除方法,如果元素不存在不返回错误 s1.discard("a") print(s1)
3. 字符编码
1. 内存固定使用unicode编码,硬盘的编码(即可以修改的软件编码)
2. 使用什么编码往硬盘存,就用什么编码去读。
3. 程序运行分两个阶段:
- 从硬盘读取到内存
- python解释器运行读到内存的代码
4. 针对一个test.py来说,pycharm与nodepad++的区别是多了3中的第二步。
5. 代码头部的编码只是告诉程序从硬盘读到内存使用什么编码。
4. 文件操作
#读文件,打开文件后需要赋值给一个变量,避免每次都要打开
‘‘‘ f = open("test1") count = 0 while count<5: print(f.readline().strip()) count += 1 #一行行的读 ‘‘‘ ‘‘‘ f = open("test1") line_nu = 0 for line in f: if line_nu < 4: print(line.strip()) line_nu +=1 else: break ‘‘‘
#写文件
# w是创建写模式的文件,无论是否存在都会重新创建
# a是追加模式
# r是读模式,默认打开是读模式
# r+ 读写
# w+ 写读,先以写的模式打开,清空文件内容
# a+ 追加读,追加到最后,跟r+效果一样
f = open("myfile","w+") f.write("你好") f.write("kaige") f.close()
#将一个列表的值写到文件中 f.writelines() #判断文件是否已经关闭,返回布尔类型 f.closed #打印文件的编码格式 f.encoding #刷新内存数据到硬盘 f.flush() #判断是不是tty文件,tty文件是不可读的,很少用 f.isatty() #判断文件是否可读 f.readable() #移动指针到特定文件位置(以字符为单位) f.seek() #查看文件是否可seek f.seekable() #查看当前指针所在位置 f.tell() #指针位置后边全部截断,可以指定长度截断,删除 f.truncate()
python15-day03 文件的基本操作