1.字典类型(dict)
字典是一个 无序 键不重复 且 元素只能是 键值对 的可变的 容器
info = {"k1": 123, "k2":234}
- 键值对
- 键不能重复 重复时数据会被覆盖
info = {"k1": 123, "k1":234}
print(info) {"k1":234}
- 键必须是可哈希类型
可哈希: int, bool, str, tuple
不可哈希: 列表 字典
v1 = 123
v2 = "武功高"
v3 = "(11, 12, 13)"
v4 = [11, 22]
v5 = {"k1": 123}
res = hash(v5)
print(res)
-
容器
-
无序 (字典在 python3.6之前无序;在python3.6之后有序 )
1.1 定义
info = {"k1": 123, "k1":234}
列表和字典 不能作为 字典的键 其他的都可以
info= {
"name":"武功高",
"age": 18,
"status":True,
"hobby":["篮球", ["足球"]]
}
1.2 独有功能
1.获取值 .get(键)
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info.get("name")
print(v1) # "武功高"
v2 = info.get("email")
print(v2) # none/null
v3 = info.get("emaill", "xxx") # 当键不存在时, v3= "xxx"
print(v3) # "xxx"
v4 = info.get("age", "999") # 当键值都存在时 v4 = 18
print(v4) # 18
if info.get("name", "1") != "1":
print("用户名已经注册")
案例
user_dict= {
"wugonggao":"666",
"hanchao":"999",
"huangyou":"123"
}
user= input("请输入姓名:")
psd = input("请输入密码:")
# 如果键不存在 db_password = none
# 如果键存在 db_password = 密码
db_password = user_dict.get(user)
if db_password == None:
print("用户名不存在")
else:
if db_password == pwd:
print("登录成功")
else:
print("登录失败")
2.键 .keys()
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info.keys() # 高仿的列表
print(v1) # dict_keys(['name', 'age', 'status', 'hobby'])
for item in info.keys():
print(item)
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info.keys()
res = list(v1)
print(res)
3.值 .values()
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info.values() # 高仿的列表
print(v1) # dict_values(['武功高', 18, True, ['篮球', ['足球']]])
for item in info.values():
print(item)
4.键值 .items()
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info.items()
print(v1)
for ele in info.items():
print(ele) # ele = ("name" , "武功高")
for key,value in info.items():
print(key,value)
1.3公共功能
1.长度 len()
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
data = len(info)
print(data)
2索引取值
列表 元组 字符串 -> 0/1/2/3/4/5/6...
字典 -> 键值对
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
v1 = info["name"] # v1 = "武功高"
v2 = info["email"] # 报错
v3 = info.get("name") # v3 = "武功高"
v4 = info.get("email") # v4 = None
字典的新增与修改
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
# 新增和修改
info["age"] = 100 # 会改成100
info["email"] = "xxx@xx.com" # 新增
字典的删除 del info[]
注意 要是要删除的键不存在
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
# 删除
del info["age"]
# 判断是否存在 存在了再删除
if "email" in info:
del info["email"]
3.for循环
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
for item in info.keys():
print(item)
for item in info.values():
print(item)
for k,v in info.item():
print(k,v)
练习题 应用
1.
对用户输入的数据进行处理 并构造成字典
# info= {"wupeiqi":"123"}
info = {}
while True:
text = input(">>>") # wupeiqi, 123
# 1. 输入q/Q 则终止
# 2.输入文本构造字典
# 3.输出字典中的所有的键值对
info = {}
while True:
text = input(">>>") # 格式是 wupeiqi, 123
a = text.split(",")
if a[0].upper() == "Q":
break
info[a[0]] = a[1]
for k, v in info.items():
print(k, v)
2. 展现商品
输出商品列表, 用户输入序号,显示用户选中的商品
# 商品列表
goods = [
{"name": "电脑", "price": 1000},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 30},
{"name": "芭比娃娃", "price": 30},
{"name": "剃须刀", "price": 100},
]
# 要求
1 .输出序号
0 电脑 1999
1 鼠标 10
2 游艇 20
...
2. 输出序号
1 电脑 1999
2 鼠标 10
3 游艇 20
3.用户输入序号 1 输出对应位置的商品
goods = [
{"name": "电脑", "price": 1000},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 30},
{"name": "芭比娃娃", "price": 30},
{"name": "剃须刀", "price": 100},
]
for i in range(len(goods)):
print("{} {} {}".format(i + 1, goods[i].get("name"), goods[i].get("price")))
choice = input("请输入商品序列号码:")
if choice.isdecimal() and int(choice) < len(goods):
choice = int(choice)
index = choice - 1
current_dict = goods[index]
text = "您购买的商品是{},价格是{}".format(goods[int(num) - 1]["name"], goods[int(num) - 1]["price"])
print(text)
else:
print("序号必须是数字")
goods = [
{"name": "电脑", "price": 1000},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 30},
{"name": "芭比娃娃", "price": 30},
{"name": "剃须刀", "price": 100},
]
for i in range(len(goods)):
print("{} {} {}".format(i + 1, goods[i].get("name"), goods[i].get("price")))
while True:
num = input("请输入商品序列号码:")
if num.isdecimal() and int(num) < len(goods):
print("您购买的商品是{},价格是{}".format(goods[int(num) - 1]["name"], goods[int(num) - 1]["price"]))
else:
print("序列号未找到")
goods = [
{"name": "电脑", "price": 1000},
{"name": "鼠标", "price": 10},
{"name": "游艇", "price": 30},
{"name": "芭比娃娃", "price": 30},
{"name": "剃须刀", "price": 100},
]
for i in range(len(goods)):
a = []
for v in goods[i].values():
a.append(v)
print("{} {} {}".format(i + 1, a[0], a[1]))
a.clear()
while True:
num = input("请输入商品序列号码:")
if num.isdecimal() and int(num) < len(goods):
print("您购买的商品是{},价格是{}".format(goods[int(num) - 1]["name"], goods[int(num) - 1]["price"]))
else:
print("序列号未找到")
3. 字典的嵌套
看代码
info = {
"k1":[11, 12, 13],
"k2":[44, 44, 66]
}
info["k1"]
info["k1"][-1]
info["k2"].append(999)
data_list = {11, 22, 33, 44, 55, 66, 77, 88, 99}
result = {
"k1": [],
"k2": []
}
for item in data_list:
if item < 50:
result["k1"].append(item)
else:
result["k2"].append(item)
print(result)
4 信息的录入
info = {"k1":123, "k2":88}
# 判断字典中是否存在xx这个键
if "xx" in info:
pass
info = {}
if "k1" in info:
pass
else:
info["k1"] = [1] # info = {"k1":[1]}
if "k1" in info:
info["k1"].append(999) # [1].append(999)
else:
pass
print(info) # info = {"k1":[1, 999]}
扩展
data_list = {11, 22, 33, 44, 55, 66, 77, 88, 99}
result = {}
# <50加入到 k1:[...] >=50添加到 k2:[...]
for item in data_list:
if item < 50
if "k1" in result:
pass # result["k1"].append(item)
else:
result["k1"] = [item]
else:
pass
# 第一次循环后 result = {"k1":[11]}
# 第二次循环后 result = {"k1":[11, 22]}
data_list = {11, 22, 33, 44, 55, 66, 77, 88, 99}
result = {}
# <50加入到 k1:[...] >=50添加到 k2:[...]
for item indata_list:
if item < 50
if "k1" in result:
result["k1"].append(item)
else:
result["k1"] = [item]
else:
if "k2" in result:
result["k2"].append(item)
else:
result["k2"] = [item]
5 快递[列表] 信息分捡{写入字典}
addr_list = [
['王*龙', '北京市,海淀区', '苏州街大恒科技大厦南座4层1'],
["庞*飞", "北京市,昌平区", "汇德商厦四楼403"],
["顾*锐", '江苏省,扬州市', '三垛镇工业集中区扬州市立华畜禽有限公司'],
['王*飞','上海市,徐汇区', '北京市,昌平区','汇德商厦四楼403'],
['华*升', '北京市,海淀区', '杰睿大厦'],
['朱*锴', '上海市,浦东新区', '川沙新镇华川家园33号楼503'],
['陈*盼', '浙江省,杭州市', '闲林街道,西溪华东园,十幢一单元401。'],
['司*鹏', '河南省,鹤壁市', '淇滨大道310号鹤壁京立医院'],
['聂*睿', '河北省,石家庄市', '中山路勒泰中心写字楼b座11层'],
['张*', '辽宁省,本溪市', '明兴丽城九号楼四单元1'],
['冉*晗', '河北省,石家庄市', '体育南大街385号'],
['高*杰', '北京市,朝阳区', '广渠路42号院3号楼,408'],
['李*国', '安徽省,合肥市', '新站区淮合花园'],
['常*源', '江苏省,南京市', '白下路242号,南京市红十字医院,放射科1'],
["张*玉", "河北省,沧州市", "新居然家居广场"],
['王*川', '上海市,奉贤区', '南桥镇贝港七区1'],
['冀*庆', '河北省,保定市', '河北大学坤兴园生活区1'],
['胡*晨', '浙江省,宁波市', '浙江省宁波市江东区中山首府A座2004室'],
['尹*婷', '湖北省,武汉市', '武汉大学信息学部'],
['李*东', '辽宁省,大连市', '大关一街3号3-3-1'],
['张*', '天津市,河西区', '隆昌路94号(天津科技馆)1'],
['刘*', '湖北省,黄冈市', '城关镇']
]
for item in addr_list:
name = item[0]
province = item[1].split(",")[0]
city = item[1].split(",")[1]
print("{}在{}{}".format(name, province, city))
按照地区分类
addr_list = [
['王*龙', '北京市,海淀区', '苏州街大恒科技大厦南座4层1'],
["庞*飞", "北京市,昌平区", "汇德商厦四楼403"],
["顾*锐", '江苏省,扬州市', '三垛镇工业集中区扬州市立华畜禽有限公司'],
['王*飞','上海市,徐汇区', '北京市,昌平区','汇德商厦四楼403'],
['华*升', '北京市,海淀区', '杰睿大厦'],
['朱*锴', '上海市,浦东新区', '川沙新镇华川家园33号楼503'],
['陈*盼', '浙江省,杭州市', '闲林街道,西溪华东园,十幢一单元401。'],
['司*鹏', '河南省,鹤壁市', '淇滨大道310号鹤壁京立医院'],
['聂*睿', '河北省,石家庄市', '中山路勒泰中心写字楼b座11层'],
['张*', '辽宁省,本溪市', '明兴丽城九号楼四单元1'],
['冉*晗', '河北省,石家庄市', '体育南大街385号'],
['高*杰', '北京市,朝阳区', '广渠路42号院3号楼,408'],
['李*国', '安徽省,合肥市', '新站区淮合花园'],
['常*源', '江苏省,南京市', '白下路242号,南京市红十字医院,放射科1'],
["张*玉", "河北省,沧州市", "新居然家居广场"],
['王*川', '上海市,奉贤区', '南桥镇贝港七区1'],
['冀*庆', '河北省,保定市', '河北大学坤兴园生活区1'],
['胡*晨', '浙江省,宁波市', '浙江省宁波市江东区中山首府A座2004室'],
['尹*婷', '湖北省,武汉市', '武汉大学信息学部'],
['李*东', '辽宁省,大连市', '大关一街3号3-3-1'],
['张*', '天津市,河西区', '隆昌路94号(天津科技馆)1'],
['刘*', '湖北省,黄冈市', '城关镇']
]
result = {}
for item in addr_list:
name = item[0]
province = item[1].split(",")[0]
city = item[1].split(",")[1]
town = item[2]
if province in result:
result[province].append(name)
else:
result[province] = [name]
print(result)
4 补充:嵌套
- 容器: 元组, 列表,字典(建可以哈希)
info = {
"k1":123,
"k2":(11, 22, 33)
"k3":[11, 22, 33],
"k4":[11, 22, 33, {"v1":123, "v2":456}],
}
5 补充: 哈希
字典的键必须是可以哈希的 不能是 字典 列表
v1 = [11, 22, 3, 44, 55, 6]
字典的底层原理
创建一个字典 电脑里有一个位置存储信息
其中一个简单的存储方法 假设 有6个位置 name键的值算出来是123423 则用哈希值除以6 得到 余数 就是要存储的位置
info = {
"name": "武功高",
"age": 18,
"status": True,
"hobby": ["篮球", ["足球"]]
}
info.get("name") # 直接根据 "name" 可以直接找到值
由于字典的底层原理 导致其根据键取值时速度特别快
v1 = [1, 2, 3, 4, 5, 5,...] # 假设有3万以上值
if 66 in v1: # 这里需要遍历所有值才能找到 列表里的具体值
pass
练习
以下那些值不能作为字典的键
1
-1
""
"xxx"
None
[1, 2, 3] # 不可以
(1,)
{"k1":"v1", "k2":"v2"} # 不可以
小结
-
字符串 str
-
独有功能
大写/小写/去除空白/分割/替换/是否数字//左右填充
upper/lower/strip/lstrip/rstrip/join/replace/isdecimal/center/rjust/ljust/zfill
-
公共功能
长度/索引/切片/for循环/in是否包含 len
-
列表 list
- 独有功能
追加/插入/删除(值)/删除(根据索引)/清除/排序 append/insert/remove/pop/clear/sort
-
公共
长度/索引(读 删 改)/切片(读 删 改)/for循环/in是否包含
-
元组 tuple
- 独有功能(无)
- 公共
长度/索引/切片/for循环/in是否包含
-
字典 dic
- 独有功能
get/keys/values/items
-
公共功能
len/索引键(读, 删 改 添加)/for循环/in是否包含(键)
info = { "k1": 123 "k2": 456 } info["k3"] = 1234 del info["k2"]
2.集合(set)
集合是一个无序 可变 元素必须 可哈希 且元素不重复的容器
2.1定义
v1 = {11, 22, 33, 44, 55, 66}
注意: 定义一个空集合
# 定义空列表
v1 = []
v2 = list()
# 定义空元组
v3 = ()
v4 = tuple()
# 定义空字典
v5 = {}
v6 = dict()
# 定义空集合
v7 = set() # 不能写成 v7 = {}
-
无序 没有索引的操作
-
可变
v1 = {11, 22} v1.add(33) print(v1) # {11, 22, 33}
-
元素不重复
v1 = {11, 22}
v1.add(11)
print(v1) # {11, 22}
- 元素必须可哈希
不可哈希 : list, dict, set
可哈希: int, bool, str, tuple
一般什么时候用集合?
不希望重复一个数据的集合
例如:
通过网络爬虫的技术去网上下载各种图片 视频
每个图片都有一个 url, 维护一个集合 集合里面存放所有已经下载过的图片的url
2.2 独有功能
1.添加元素 set.add(a)
v1 = {11, 22}
v1.add(33)
print(v1) # {11, 22, 33}
v1 = set()
v1.add(33)
v1.add("张三")
print(v1) # {33, "张三"}
2.删除元素 set.discard(a)
v1 = {11, 12}
v1.discard(11)
print(v1) # {12}
v1 = {11, 12}
v1.discard(66) # 不会报错 与列表的remove一样
print(v1) # {11, 12}
3.交集 set1.intersection(set2)
v1 = {"马其坤", "张三", "李四"}
v2 = {"张三", "王二", "麻子"}
# 方式1
res = v1.intersection(v2) # 这里要有一个集合接收信息
print(res) # "张三"
# 方式2
res = v1 & v2 # 这里要有一个集合接收信息
print(res) # "张三"
4.并集 set1.union(set2)
v1 = {"马其坤", "张三", "李四"}
v2 = {"张三", "王二", "麻子"}
# 方式1
res = v1.union(v2) # 这里要有一个集合接收信息
print(res) # "张三"
# 方式2
res = v1 | v2 # 这里要有一个集合接收信息
print(res) # "张三"
5.差集
v1 = {"马其坤", "张三", "李四"}
v2 = {"张三", "王二", "麻子"}
a1 = vi.difference(v2) # v1 有 v2中没有的值{"马其坤", "李四"}
a2 = v1 - v2 # {"马其坤", "李四"}
a3 = v2.difference(v1) # v2中有但v1中没有的值 {"王二", "麻子"}
2.3公共功能
1.长度 len(set)
v1 = {"马其坤", "张三", "李四"}
data = len(v1)
print(data) # 3
2.for循环
v1 = {"马其坤", "张三", "李四"}
for item in v1:
print(item)
3.in是否包含 这个查询的效率高 速度快 和字典的方式一样
v1 = {"马其坤", "张三", "李四"}
if "马其坤" in v1:
print("在")
else:
print("不在")
2.4存储
和字典的存储方式一样 用 in 很容易找到确定的值
3 list tuple set 转换
-
list
v1 = [11, 22, 33, 44]
-
tuple
v2 = (11, 22, 33, 44)
-
set
v3 = {11, 22, 33, 44}
三个之间可以进行相互转换 原则想转化弄成什么就用什么包裹一下
v1 = [11, 22, 33, 44]
res = set(v1)
res = tuple(v1)
print(res)
当元组 列表 转换成集合 会去重
v1 = [11, 22, 33, 44, 22]
res = set(v1)
print(res) # [11, 22, 33, 44]
v1 = [11, 22, 33, 44]
res = tuple(v1)
print(res)
4.None类型
none 表示空值
# v1设置为空
v1 = None
v2 = None
# 再 在内 重新创建一个字符串 让v1 指向字符串
v1 = "张大三"
v2 = "张大四" # 内村会有三个地方有信息 None "张大三" "张大四"
v1 = ""
v2 = ""
v1 = "张大三"
v2 = "张大四" # 内存会有四个地方有信息 "" "" "张大三" "张大四"
v1 = None # 内存中会有一个地址保存 none (空 的意思)
v2 = None
v3 = None
v4 = None # 后面的v2 v3 v4 都是指向 v1所指的 None 一个地方
v5 = "" # 内存中会有一个地方 是 "" v5指向这里
v6 = "" # 内存中会有一个地方 是 "" v6指向这里
v7 = "" # 内存中会有一个地方 是 "" v7指向这里
v8 = "" # 内存中会有一个地方 是 "" v8指向这里
# 都是空字符串 但是他们每一个都是不同的 占内存不同的地方
5.布尔类型
真/假True/False
很多类型都是可以转换为布尔值的 有真有假, None 是空值 None 不代表None这个字符
0 , "", [], () , {}, set() None False-> False
其他都为 True
如果你将布尔值写入循环:
if True:
pass
while True:
pass
if 1 > 2:
pass
# 内部会自动转换为 布尔值 True False
if "张大三":
pass
if "": # False
pass
else: # True
pass
while 2: # True
pass
6.浮点型(float)
浮点型就是我们常说的小数
v1 = 32.4
v2 = 56.7
由于计算机底层浮点型的存储原理 , 有时候浮点型获取的值不太精确
与语言无关 计算机的底层存储原理导致的问题
v1 = 0.1
v= 0.2
v3 = v1 + v2
print(v3) # 0.30000000000000004
1 浮点数精确计算 decimal.Decimal()
如果需要 精确的 计算:
import decimal
v1 = decimal.Decimal("0.1")
v2 = decimal.Decimal("0.2")
v3 = v1 + v2
print(v3) # 0.3
7.字节类型(bytes)
name = "张大三" # str 底层用 unicode编码
data = name.encode("utf-8") # bytes字节 底层用 unicode编码
print(data)
# b'\xe5\xbc\xa0\xe5\xa4\xa7\xe4\xb8\x89' 每个字有三个字节
1 .文字转字节
name = "张大三" # str 底层用 unicode编码
data = name.encode("gbk") # bytes字节 底层用gbk编码
print(data)
# b'\xd5\xc5\xb4\xf3\xc8\xfd' 每个字有2个字节表示
2.字节转文字
name_1 = "b'\xd5\xc5\xb4\xf3\xc8\xfd'"
name_2
data1 = name_1.decode("gbk") # bytes字节 底层用gbk编码
data2 = name_2.decode("utf-8") # bytes字节 底层用unicode编码
print(data1, data2)
8.文件操作
相对路径写法
相对路径是 ./static/xx/xx
表示当前文件所在的上级目录下找文件static
也可以直接写成
/static/xx/xx
static/xx/xx
在 当前目录的上级目录的 上级目录下找文件夹 目录前面 …/ (目录前面加两点 反斜杠)
<link rel="stylesheet" href="../static/plugins/bootstrap-3.4.1/css/bootstrap.css">
<!--表示在 当前目录的上级目录的 上级目录下找文件夹 static-->
注意 是两点
绝对路径写法
自己在自己电脑里面可以这么写 用于写入文本 xlsx docx
但是 浏览器使用路径时 会加上 fill/// 会找不到路径
<link rel="stylesheet" href="E/pytharm projects/try_creat_a_web_use_bootstrapstatic/plugins/bootstrap-3.4.1/css/bootstrap.css">
普通的文本文件
三个基本操作
打卡文件
读取文件
关上文件
*判断文件是否存在的代码
import os
file_path = r""
res = os.path.exists(file_path)
print(res) # True/False
1.快速读写
1.1写文件 wb
# 1.打开文件 open()
# - "unicom.txt" 文件路径
# - mode = "wb" 打开的模式 wb 写的模式
"""
"wb"模式 打开文件时 文件不存在 会创建文件 存在会清空文件内容 然后再写入
"""
file_object = open("unicom.txt", mode="wb")
# 2.写内容
name = "武功高" # unicode
file_object.write(name.encode("utf-8"))
# 3.关闭文件
file_object.close()
file_object = open("unicom.txt", mode="wb")
# 2.写内容
name_1 = "武功高\n" # unicode
name_2 = "武功高\n" # 加上\n就是换行
file_object.write(name_1.encode("utf-8"))
file_object.write(name_2.encode("utf-8"))
# 3.关闭文件
file_object.close()
写入列表信息 可以将列表转换为字符串 format 然后写入
data = [
['王*龙', '北京市,海淀区', '苏州街大恒科技大厦南座4层1'],
["庞*飞", "北京市,昌平区", "汇德商厦四楼403"],
["顾*锐", '江苏省,扬州市', '三垛镇工业集中区扬州市立华畜禽有限公司'],
['王*飞','上海市,徐汇区', '北京市,昌平区','汇德商厦四楼403'],
['华*升', '北京市,海淀区', '杰睿大厦'],
['朱*锴', '上海市,浦东新区', '川沙新镇华川家园33号楼503'],
['陈*盼', '浙江省,杭州市', '闲林街道,西溪华东园,十幢一单元401。'],
['司*鹏', '河南省,鹤壁市', '淇滨大道310号鹤壁京立医院'],
['聂*睿', '河北省,石家庄市', '中山路勒泰中心写字楼b座11层'],
['张*', '辽宁省,本溪市', '明兴丽城九号楼四单元1'],
['冉*晗', '河北省,石家庄市', '体育南大街385号'],
['高*杰', '北京市,朝阳区', '广渠路42号院3号楼,408'],
['李*国', '安徽省,合肥市', '新站区淮合花园'],
['常*源', '江苏省,南京市', '白下路242号,南京市红十字医院,放射科1'],
["张*玉", "河北省,沧州市", "新居然家居广场"],
['王*川', '上海市,奉贤区', '南桥镇贝港七区1'],
['冀*庆', '河北省,保定市', '河北大学坤兴园生活区1'],
['胡*晨', '浙江省,宁波市', '浙江省宁波市江东区中山首府A座2004室'],
['尹*婷', '湖北省,武汉市', '武汉大学信息学部'],
['李*东', '辽宁省,大连市', '大关一街3号3-3-1'],
['张*', '天津市,河西区', '隆昌路94号(天津科技馆)1'],
['刘*', '湖北省,黄冈市', '城关镇']
]
file_object = open("address.txt", mode="wb")
for item in range(len(data)):
items = "{},{},{}\n".format(data[item][0], data[item][1], data[item][2])
print(items)
file_object.write(items.encode("utf-8"))
file_object.close()
练习题目: 实现用户注册 每注册一个用户就在文件中写入一行
循环操作 直到q/Q终止
user= input("用户名:")
pwd = ("密码:")
文件中这么写入
wupeiqi, 123
root, 456
admin, asdf
file_object = open("unicom.txt", mode="wb")
while True:
user = input("用户名:")
if user.upper() == "Q":
break
pwd = input("密码:")
data[user] = pwd
text_a = "{}, {}\n".format(user, pwd)
file_object.write(str_1.encode("utf-8"))
# 这里并没有把内容写到文件中 写到了内存中 计算机的缓冲区 要等文件写到一定的量 或者到一个时间 才会将内容写如到文件中
file_object.close() # 这里会把之前写进缓冲区 的内容写入文件并关闭文件
# 用了一个东西接收信息再一次写入 nuicom.txt
data = {}
str_1 = ""
while True:
user = input("用户名:")
if user.upper() == "Q":
break
pwd = input("密码:")
data[user] = pwd
for k, v in data.items():
text_a = "{}, {}\n".format(k, v)
str_1 = "{}{}".format(str_1, text_a)
text_a[2:]
print(text_a, str_1)
file_object = open("unicom.txt", mode="wb")
file_object.write(str_1.encode("utf-8"))
file_object.close
1.1.1强制将文件写入硬盘
file_object.flush() #强制将文件的内容写入硬盘 文件
1.2写文件 追加 ab
ab模式 文件不存在 创建文件 文件存在 在文件的尾部追加写入
file_object = open("unicom.txt", mode="ab")
file_object.write(str_1.encode("utf-8"))
file_object.close
1.3读取文件内容 rb
read() : 读取全部文件 是读取它的字节
decode() : 还需要转换为Unicode 之前用utf-8 现在就用utf - 8 用gbk 就用 gbk
file_object = open("user.txt",mode="rb")
data = file_object.read()
# 读取全部文件
data_string = data.decode("utf-8")
# 将utf-8类型字节转换为unicode
print(data)
file_object.close()
1.3.1读取文件后 操作
可以对读取的文件 字符串 进行操作
file_object = open("unicom.txt",mode="rb")
data = file_object.read()
# 读取全部文件
data_string = data.decode("utf-8")
# 将utf-8类型字节转换为unicode
print(data)
row_list = data_string.strip().split("\n")
print(row_list)
file_object.close()
如果文件有100个G 我们能用上述的 模式 读取吗 # 不能
1.3.2 读取大文件的时候可以逐条读取 但是不知道什么时候结束
file_object = open("user.txt", mode="rb")
line1 = file_object.readline()
print(line1)
line2 = file_object.readline()
print(line2)
file_object.close()
file_object = open("unicom.txt", mode="rb")
for item in file_object:
items = item.decode("utf-8").split("\n")
print(items)
file_object.close()
练习题
1 读取文件中的企业名称
file_object = open("unicom.txt", mode="rb")
for line_string in file_object:
line_string = item.decode("utf-8").strip()
if line_string:
name = line_string.split(",")[1]
print(name)
file_object.close()
data = [
['王*龙', '北京市,海淀区', '苏州街大恒科技大厦南座4层1'],
["庞*飞", "北京市,昌平区", "汇德商厦四楼403"],
["顾*锐", '江苏省,扬州市', '三垛镇工业集中区扬州市立华畜禽有限公司'],
['王*飞','上海市,徐汇区', '北京市,昌平区','汇德商厦四楼403'],
['华*升', '北京市,海淀区', '杰睿大厦'],
['朱*锴', '上海市,浦东新区', '川沙新镇华川家园33号楼503'],
['陈*盼', '浙江省,杭州市', '闲林街道,西溪华东园,十幢一单元401。'],
['司*鹏', '河南省,鹤壁市', '淇滨大道310号鹤壁京立医院'],
['聂*睿', '河北省,石家庄市', '中山路勒泰中心写字楼b座11层'],
['张*', '辽宁省,本溪市', '明兴丽城九号楼四单元1'],
['冉*晗', '河北省,石家庄市', '体育南大街385号'],
['高*杰', '北京市,朝阳区', '广渠路42号院3号楼,408'],
['李*国', '安徽省,合肥市', '新站区淮合花园'],
['常*源', '江苏省,南京市', '白下路242号,南京市红十字医院,放射科1'],
["张*玉", "河北省,沧州市", "新居然家居广场"],
['王*川', '上海市,奉贤区', '南桥镇贝港七区1'],
['冀*庆', '河北省,保定市', '河北大学坤兴园生活区1'],
['胡*晨', '浙江省,宁波市', '浙江省宁波市江东区中山首府A座2004室'],
['尹*婷', '湖北省,武汉市', '武汉大学信息学部'],
['李*东', '辽宁省,大连市', '大关一街3号3-3-1'],
['张*', '天津市,河西区', '隆昌路94号(天津科技馆)1'],
['刘*', '湖北省,黄冈市', '城关镇']
]
file_object = open("address.txt", mode="wb")
for item in range(len(data)):
items = "{},{},{}\n".format(data[item][0], data[item][1], data[item][2])
print(items)
file_object.write(items.encode("utf-8"))
file_object.close()
2用户注册 登录功能
-
注册部分: 用户名和密码写入文件
zzz, 123 daf, 12345 admin, 444
-
登录部分 :输入一次用户名和密码 去文件中对比用户名和密码是否正确
# 1.注册 print("======用户注册======") register_file = open("user_info.txt",mode="ab") # 注册用追加 while True: user = input("请输入用户名:") if user.upper() == "Q": # 我想在这里检索文件里的信息 有信息就说用户名已经注册 break pwd = input("请输入密码:") line = "{},{}\n".format(user, pwd) register_file.write(line.encode("utf-8")) register_file.close() print("======用户登录======") username = input("用户名:") password = input("密码:") is_success = False # 在循环外面放一个变量 用来确定循环是否走完 login_file = open("user_info.txt", mode="rb") for item in login_file: # item 是用户名密码 将其从字节转换为 Unicode 文字 item_str = item.decode("utf-8") item_string = item_str.strip() if item_string: user_pwd_list = item_string.split(",") if username == user_pwd_list[0] and password == user_pwd_list[1]: is_success = True login_file.close() if is_success: print("登录成功") else: print("登录失败")
name = input("用户:") psw = input("密码:") file_object = open("datas.txt",mode="rb") for line in file_object: line_n = item.decode("utf-8").strip().split("\n") a = len(line_n) data_list = line_n.split(",") if name == data_list[0] and psw == data_list[1]: print("欢迎登录网站") file_object.close() break else: if continue print("请注册网站") name = input("用户:") psw = input("密码:") file_object = open("datas.txt", mode="wb") text = "{}, {}".format(name, psw) file_object.write(text.encode("utf-8")) file_object.close()
题目没有完成 自己的想法没有实现 还要改
file_object = open("datas.txt", mode="wb") if file_object == None: print("请注册网站") name = input("用户:") psw = input("密码:") file_object = open("datas.txt", mode="wb") text = "{}, {}".format(name, psw) file_object.write(text.encode("utf-8")) file_object.close() name = input("用户:") psw = input("密码:") file_object = open("datas.txt", mode="rb") a = 0 b = 0 for line in file_object: a += 1 for line in file_object: b += 1 line_n = line.decode("utf-8").strip().split("\n") data_list = line_n[0].split(",") if name == data_list[0] and psw == data_list[1]: print("欢迎登录网站") file_object.close() break else: if b <= a: continue else: print("请注册网站") name = input("用户:") psw = input("密码:") file_object = open("datas.txt", mode="wb") text = "{}, {}".format(name, psw) file_object.write(text.encode("utf-8")) file_object.close()
8.2 with上下文
写代码时会忘记关闭文件
file_object = open(...)
file_object.read()
file_object.close() # 强调 要关闭文件
print("开始")
# 离开时自动关闭文件
with open("xxx.txt",made= "rb") as file_object:
data = file_object.read()
print(data)
print("结束")
8.3 总结打开文件的模式 wb w ab a rb r
-
wb 写
file_object = open("unicom.txt", mode="wb") # 2.写内容 name = "武功高" # unicode file_object.write(name.encode("utf-8")) # 3.关闭文件 file_object.close()
-
w 写
file_object = open("unicom.txt", mode="w",encoding="utf-8") # 2.写内容 name = "武功高" # unicode file_object.write(name) # 由于打开文件时设置coding 在内部会进行 encode压缩 # 3.关闭文件 file_object.close()
-
ab 追加 会创建文件 不会删除内容
file_object = open("unicom.txt", mode="ab") # 2.写内容 name = "武功高" # unicode file_object.write(name.encode("utf-8")) # 3.关闭文件 file_object.close()
-
a , 追加 会创建文件不会删除
file_object = open("unicom.txt", mode="a",encoding="utf-8") # 2.写内容 name = "武功高" # unicode file_object.write(name.encode("utf-8")) # 3.关闭文件 file_object.close()
-
rb 读
file_object = open("unicom.txt", mode="rb")
# 读取到的文件内部原始的被压缩之后的数据utf-8编码的数据
data = file_object.read()
data_string = data.decode("utf-8")
# 3.关闭文件
file_object.close()
-
r 读
file_object = open("unicom.txt", mode="r",encoding="utf-8") # 可以直接读取数据 data_string = file_object.read() # 3.关闭文件 file_object.close()
# 1.注册
print("======用户注册======")
register_file = open("user_info.txt",mode="ab") # 注册用追加
while True:
user = input("请输入用户名:")
if user.upper() == "Q": # 我想在这里检索文件里的信息 有信息就说用户名已经注册
break
pwd = input("请输入密码:")
line = "{},{}\n".format(user, pwd)
register_file.write(line.encode("utf-8"))
register_file.close()
print("======用户登录======")
username = input("用户名:")
password = input("密码:")
is_success = False # 在循环外面放一个变量 用来确定循环是否走完
login_file = open("user_info.txt", mode="r", encoding="utf-8")
for item in login_file:
# item 是用户名密码 将其从字节转换为 Unicode 文字
item_string = item.strip()
if item_string:
user_pwd_list = item_string.split(",")
if username == user_pwd_list[0] and password == user_pwd_list[1]:
is_success = True
login_file.close()
if is_success:
print("登录成功")
else:
print("登录失败")
t.write(name) # 由于打开文件时设置coding 在内部会进行 encode压缩
3.关闭文件
file_object.close()
* ab 追加 会创建文件 不会删除内容
```python
file_object = open("unicom.txt", mode="ab")
# 2.写内容
name = "武功高" # unicode
file_object.write(name.encode("utf-8"))
# 3.关闭文件
file_object.close()
-
a , 追加 会创建文件不会删除
file_object = open("unicom.txt", mode="a",encoding="utf-8") # 2.写内容 name = "武功高" # unicode file_object.write(name.encode("utf-8")) # 3.关闭文件 file_object.close()
-
rb 读
file_object = open("unicom.txt", mode="rb")
# 读取到的文件内部原始的被压缩之后的数据utf-8编码的数据
data = file_object.read()
data_string = data.decode("utf-8")
# 3.关闭文件
file_object.close()
-
r 读
file_object = open("unicom.txt", mode="r",encoding="utf-8") # 可以直接读取数据 data_string = file_object.read() # 3.关闭文件 file_object.close()
# 1.注册
print("======用户注册======")
register_file = open("user_info.txt",mode="ab") # 注册用追加
while True:
user = input("请输入用户名:")
if user.upper() == "Q": # 我想在这里检索文件里的信息 有信息就说用户名已经注册
break
pwd = input("请输入密码:")
line = "{},{}\n".format(user, pwd)
register_file.write(line.encode("utf-8"))
register_file.close()
print("======用户登录======")
username = input("用户名:")
password = input("密码:")
is_success = False # 在循环外面放一个变量 用来确定循环是否走完
login_file = open("user_info.txt", mode="r", encoding="utf-8")
for item in login_file:
# item 是用户名密码 将其从字节转换为 Unicode 文字
item_string = item.strip()
if item_string:
user_pwd_list = item_string.split(",")
if username == user_pwd_list[0] and password == user_pwd_list[1]:
is_success = True
login_file.close()
if is_success:
print("登录成功")
else:
print("登录失败")
学习笔记