数据类型 下

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":(1122, 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 = {1122}
    v1.add(33)
    
    print(v1)  # {11, 22, 33}
    
  • 元素不重复

v1 = {1122}
v1.add(11)

print(v1)  # {11, 22}
  • 元素必须可哈希
不可哈希 : list, dict, set
可哈希:  int, bool, str, tuple

一般什么时候用集合?

不希望重复一个数据的集合

例如:

​ 通过网络爬虫的技术去网上下载各种图片 视频

​ 每个图片都有一个 url, 维护一个集合 集合里面存放所有已经下载过的图片的url

2.2 独有功能

1.添加元素 set.add(a)

v1 = {1122}
v1.add(33)

print(v1)  # {11, 22, 33}
v1 = set()
v1.add(33)
v1.add("张三")

print(v1)  # {33, "张三"}

2.删除元素 set.discard(a)

v1 = {1112}
v1.discard(11)
print(v1)  # {12}


v1 = {1112}
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("登录失败")

学习笔记

  • 38
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值