Python学习笔记 day2 基础2

1.列表、元组操作

列表

定义列表 和 访问列表

names = ["小东", "小西", "小南", "小北"]
print(names[0])
print(names[-1])  # 倒着取,取最后一个

结果:
小东
小北

切片:取多个元素

print(names[1:3])  # 左闭右开,起始位置包括,尾部位置不包括。 取下标1至3之间的数字,包括1,不包括3

结果:['小西', '小南']

# 取前三个
print(names[0:3])
print(names[:3]
结果:['小东', '小西', '小南']

# 切片是从左往右数的
print(names[-3:-1])  # 左闭右开
结果:['小西', '小南']

print(names[1:-1])  # 取下标1至-1的值,不包括-1
结果:['小西', '小南']

# 如果想取到最后一个呢?
print(names[-3:])
结果:['小西', '小南', '小北']

print(names[1:])
结果:['小西', '小南', '小北']

# 分隔
步长切片
print(names[0::2]) #后面的2是代表,每隔一个元素,就取一个
结果:['小东', '小南']

等同于 print(names[::2])  print(names[0:-1:2])

追加

names.append("小中")
print(names)
结果:['小东', '小西', '小南', '小北', '小中']

插入

# 定位前插入,插在小西前面
names.insert(1, "小A")
print(names)
结果:['小东', '小A', '小西', '小南', '小北', '小中']

修改

names[2] = "小B"
print(names)
结果:['小东', '小A', '小B', '小南', '小北', '小中']

删除

remove
names.remove("小B")
print(names)
结果:['小东', '小A', '小南', '小北', '小中']

pop  # 默认删除列表最后一个值,在括号加数值效果等同于 del
names.pop()
print(names)
结果:['小东', '小A', '小南', '小北']

del 可删除单个元素 也可以删除整个列表
del names[1]
print(names)
结果:['小东', '小南', '小北']

扩展

扩展: 列表扩展
names = ["小东","小南","小北"]
b = [1,2,3]
names.extend(b)
print(names)
结果:['小东', '小南', '小北', 1, 2, 3]

拷贝
了解

浅copy  
names = ["小东", "小南", "小北", 1, 2, 3]
name_copy = names.copy()
print(name_copy)
结果:['小东', '小南', '小北', 1, 2, 3]

浅copy 只拷贝一层
列表是单独的内存地址,如果列表中有列表
copy复制的是内存地址
names = ["小东", "小西", ["复制1","复制2"], "小北"]
name_copy = names.copy()
print(names)
print(name_copy)
print('\n')
names[1] = "复制"
names[2][0] = "Bin"  # 因为同一块列表的内存地址 ,因此没有完全独立,只copy了第一层 小西。
print(names)
print(name_copy)
print('\n')
del name_copy[2][0]  # 删除第二个的时候第一个也跟着删除了。占用的内存地址是一样的
print(names)
print(name_copy)

结果:
['小东', '小西', ['复制1', '复制2'], '小北']
['小东', '小西', ['复制1', '复制2'], '小北']
['小东', '复制', ['Bin', '复制2'], '小北']
['小东', '小西', ['Bin', '复制2'], '小北']

['小东', '复制', ['复制2'], '小北']
['小东', '小西', ['复制2'], '小北']

浅copy 之 方法 23
name_copy2 = names[:]
name_copy3 = list(names)

浅copy场景:用于 两个人 用同一个存款的情况,当其中一个人用了存款的钱,则都会变。但名字两个人是独立的。


深copy
独立的克隆一个列表,占两个内存空间
import copy
names = ["小东", "小西", ["复制1","复制2"], "小北"]
name_copy = copy.deepcopy(names)
print(names)
print(name_copy)
print('\n')
names[1] = "复制"
names[2][0] = "Bin"  # 独立的克隆一个列表,占两个内存空间
print(names)
print(name_copy)
结果:
['小东', '小西', ['复制1', '复制2'], '小北']
['小东', '小西', ['复制1', '复制2'], '小北']

['小东', '复制', ['Bin', '复制2'], '小北']
['小东', '小西', ['复制1', '复制2'], '小北']

统计

names = ["小东", "小南", "小南"]
print(names.count("小南"))
结果:2

排序&翻转

排序:特殊符号>数字>大写>大小,按照ASCII码对照来的
names = ["5小东", "3小南", "8小北"]
names.sort()
print(names)
结果:['3小南', '5小东', '8小北']


names = ["小东", "小南", "小北"]
names.reverse()
print(names)
结果:['小北', '小南', '小东']

获取下标

names = ["小东", "小南", "小北"]
print(names.index("小南"))
结果:1

print(names[names.index("小南")])
结果:小南

元组

元组只有2个方法,一个是count,一个是index,只能查 不能改,可以理解为只读列表
场景:希望值是不能被改变的

names = ("小东", "小南", "小北")

程序:购物车程序

需求:
1.启动程序后,让用户输入工资,然后打印商品列表
2. 允许用户根据商品编号购买商品
3. 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
4.可随时退出,退出时,打印已购买商品和余额

# 购物车实例
product_list = [
    ('OPPO ACE',3100),
    ('HUAWEI P40',4399),
    ('Xiaomi K30',4000),
    ('Milk',45),
    ('Coca Cola',10)
]
shopping_list = []

salary = input("Input your salary:")
if salary.isdigit():
    salary = int(salary)
    while True:
        """
        for item in product_list:
            print(product_list.index(item),item)
        """
        for index,item in enumerate(product_list):
            print(index,item)
        user_choice = input("选择需要购买的编号:")
        if user_choice.isdigit():
            user_choice = int(user_choice)
            if user_choice < len(product_list) and user_choice >=0:
                p_item = product_list[user_choice]
                if p_item[1] <= salary:
                    shopping_list.append(p_item)
                    salary -= p_item[1]
                    print("Added %s into shopping cart,your current balance is \033[31;1m%s\033[0m" % (p_item,salary))
                else:
                    print("\033[41;1m你的余额只剩[%s]啦\033[0m" % salary)
            else:
                print("product code [%s] is not exitst!" % user_choice)
        elif user_choice == 'q':
            print('-----shipping list------')
            for p in shopping_list:
                print(p)
            print("Your current valance:", salary)
            exit()
        else:
            print("Invalid Options")
else:
    print("你输入的不是数字")


优化:
1.用户和商家
用户
商品信息存在文件里
已购商品,余额记录

商家
可以添加商品,修改商品价格

 

2.字符串操作

特性:不可修改

# 首字母大写
name = "xiAoBin"
print(name.capitalize())  

# 大写全部变小写
print(name.casefold())    
print(name.lower())

# 小写全部变大写
print(name.upper()) 

# 大写变小写,小写变大写
print(name.swapcase())

# 统计i 出现次数
print(name.count("i"))    

# 打印50个字符,如果不够就用符号 - 补上
print(name.center(50, "-"))  

结果:
Xiaobin
xiaobin
xiaobin
XIAOBIN
XIaObIN
2
---------------------xiAoBin----------------------

# 长50,如果不够的话用*符号补上
name = "xiAoBin"
print(name.ljust(50,'*'))
print(name.rjust(50,'*'))
结果:
xiAoBin*******************************************
*******************************************xiAoBin

# title 每个字符的首字母变大写
name = "bin bin"
print(name.title())  # capitalize() 的话就是 Bin bin
结果:Bin Bin   

# 判断字符串以什么结尾 endwith
print(name.endswith("in"))
结果:True

# 转换指定tab
name = "xi \tAoBin"
print(name.expandtabs(tabsize=30))
结果:xi                            AoBin

# 查找B,找到返回其索引, 找不到返回-1
name = "xiAoBin"
print(name.find("B"))
结果:4
# 返回其索引,从左往右数,找对应最右边的索引,找不到返回-1
print(name.rfind('1'))   # 结果:5
# 返回其索引,找不到就报错 
print(name.index('C'))

# 字符串 切片
print(name[name.find("B"):])
结果:Bin

# format
name = "my name is {name} and i am {year} old"
print(name.format(name='Bin',year=22))
# print(name.format_map({'name':'Bin','year':12}))

结果:my name is Bin and i am 22 old

# 判断是否为整数
'6'.isdigit()

# 纯英文
print('abA'.isalpha())
# 包含阿拉伯数字,不能有特殊字符
print('ab23'.isalnum())
# 判断是部署一个合法的标识符
print('a1A'.isidentifier())
等等。。。。。。

# 列表 转化为 字符串  join
print('+'.join(['1','2','3']))
结果:1+2+3

# 去字符串 空格和回车
print('\nBin'.strip())  # 去掉空格和回车  去掉左边就lstrip,右边就rstrip
结果:Bin

# 把字符串转成对应后面的值,前后参数要一致
p = str.maketrans("abcdef",'123456')   
print("binbin".translate(p))
结果:2in2in

# 替换 replace
print('he bin bin'.replace('b','B'))
print('he bin bin'.replace('b','B',1)) # 替换一个
结果:
he Bin Bin
he Bin bin

# 分割字符串,默认按空格分割 split()
print('1+2 3+4 5+6 '.split())
结果:['1+2', '3+4', '5+6']

print('1+2+3+4'.split('+'))
结果:['1', '2', '3', '4']


 

3.字典操作

字典一种key - value 的数据类型
字典的特性:

dict是无序的
key必须是唯一的,因此天生去重
info = {
    'stu1':"小东",
    'stu2':"小彬",
    'stu3':"小西"
}
print(info)
结果:{'stu1': '小东', 'stu2': '小彬', 'stu3': '小西'}

print(info["stu2"])
结果:小彬

增加

info["stu4"] ="大V"
print(info)
结果:{'stu1': '小东', 'stu2': '小B', 'stu3': '小西', 'stu4': '大V'}

修改

info["stu2"] ="小B"
print(info)
结果:{'stu1': '小东', 'stu2': '小B', 'stu3': '小西'}

删除

# del
del info["stu1"]  
# info.pop("stu1")
print(info)
结果:{'stu2': '小B', 'stu3': '小西', 'stu4': '大V'}
# info.popitem() 随机删除

查找

info = {
    'stu1':"小东",
    'stu2':"小彬",
    'stu3':"小西"
}
print(info.get('stu2')) # get 有就返回指定键的值,无就返回None
结果:小彬
# info["stu2"] 也行,但这种key不存在会报错

# 判断是否在字典
print('stu2' in info)
结果:True

多级字典嵌套及操作

tv_catalog = {
    "动漫":{
        "yx": ["怡萱动漫"],
        "bili": ["哔哩哔哩"],
    },
    "韩剧":{
        "韩剧网":["梨泰院class,","请回答1988"]
    },
    "大陆":{
        "爱奇艺":["海贼王"]
    }
}

tv_catalog["大陆"]["爱奇艺"][0] += ",连载多年"
print(tv_catalog["大陆"]["爱奇艺"])
print(tv_catalog["韩剧"]["韩剧网"])

结果:
['海贼王,连载多年']
['梨泰院class,', '请回答1988']

其他姿势

info = {
    'stu1':"小东",
    'stu2':"小彬",
    'stu3':"小西"
}

#values
print(info.values())
结果:dict_values(['小东', '小彬', '小西'])

#keys
print(info.keys())
结果:dict_keys(['stu1', 'stu2', 'stu3'])

#setdefault
print(info.setdefault("stu2","AA"))
print(info.setdefault("stu4","AA"))
print(info)
结果:
小彬
AA
{'stu1': '小东', 'stu2': '小彬', 'stu3': '小西', 'stu4': 'AA'}
# 如果键不存在于字典中,将会添加键并将值设为默认值
# 返回值:如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值。

#update 合并,如果有交叉的key就覆盖,无交叉的key就新增
b = {
    'stu1':'小文',
    1:10,
    2:20
}
info.update(b)
print(info)
结果:{'stu1': '小文', 'stu2': '小彬', 'stu3': '小西', 1: 10, 2: 20}

#item 把一个字典转成了列表
print(info.items())
结果:dict_items([('stu1', '小文'), ('stu2', '小彬'), ('stu3', '小西'), (1, 10), (2, 20)])

#通过一个列表生成默认dict,少用。  
# 类似列表的copy,在嵌套多层字典下,一改全改,把一份列表的数据都放在同一个内存空间。
一层情况下
c = dict.fromkeys([1,2,3],'testd')
print(c)
结果:{1: 'testd', 2: 'testd', 3: 'testd'}

二层情况下
c = dict.fromkeys([1,2,3],[1,{"name":"小东"},444])
print(c)
c[1][1]['name']='小西'
print(c)
结果:
{1: [1, {'name': '小东'}, 444], 2: [1, {'name': '小东'}, 444], 3: [1, {'name': '小东'}, 444]}
{1: [1, {'name': '小西'}, 444], 2: [1, {'name': '小西'}, 444], 3: [1, {'name': '小西'}, 444]}


循环dict

#方法1
for key in info:  #直接索引取
    print(key,info[key])

#方法2
for k,v in info.items(): #会先把dict转成list,数据里大时莫用
    print(k,v)

程序练习

要求:
1.打印省、市、县三级菜单
2.可返回上一级
3.可随时退出程序

data = {
    '广东':{
        "广州":{
            "海珠区":["海珠富力城","珠江新城"],
            "越秀区":["越秀人民公园","纪念堂"]
            },
        "惠州":{
            "惠城区":["红花湖","西湖"],
            "惠东县":["巽寮湾","双月湾"]
            }
    },
    '广西':{
        "南宁":{
            "青秀区":["广西民族博物馆"],
            "江南区":["杨美古镇","太阳岛"]
        }
    }
}

flag = False

while not flag:
    for i in data:  # 打印第一层
        print("\t", i)
    choice = input("选择进入1:")
    if choice in data:
        while not flag:
            for i2 in data[choice]:  # 打印第二层
                print("\t", i2)
            choice2 = input("选择进入2:")
            if choice2 in data[choice]:
                while not flag:
                    for i3 in data[choice][choice2]:  # 打印第三层
                        print("\t", i3)
                    choice3 = input("选择进入3:")
                    if choice3 in data[choice][choice2]:
                        for i4 in data[choice][choice2][choice3]:
                            print("\t", i4)
                        choice4 = input("按b返回,q退出:")
                        if choice4 == "b":
                            pass
                        elif choice4 == 'q':
                            flag = True
                    if choice3 == "b":
                        break
                    elif choice3 == 'q':
                        flag = True
            if choice2 == "b":
                break
            elif choice2 == 'q':
                flag = True

4.集合操作

集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系
list_1 = [1,2,4,5,2,3,5,6]
list_1 = set(list_1)
print(list_1,type(list_1))

list_2 = set([0,2,6,4,5,8,22])

#交集
print(list_1.intersection(list_2))
# print(list_1.isdisjoint(list_2))  # list_1.isdisjoint(list_2) 如果没交集为True
#并集
print(list_1.union(list_2))
#差集
print(list_1.difference(list_2))  # 在列表1有,但在列表2没有
print(list_2.difference(list_1))  # 在列表2有,但在列表1没有
#对称差集,我有你没,你有我没, 等同于上面两个差集结果的并集
print(list_1.symmetric_difference(list_2))
#子集
list_3 = set([2,4,6])
print(list_3.issubset(list_1))  # 判断list3是否为list1的子集
print(list_1.issuperset(list_3))  # 判断list1是否为list3的父集

#交集
print(list_1 & list_2)
#并集
print(list_2 | list_1)
#差集
print(list_1 - list_2) # in list_1 but not int list_2
#对称差集
print(list_1 ^ list_2)

结果:
{1, 2, 3, 4, 5, 6} <class 'set'>
{2, 4, 5, 6}
False
{0, 1, 2, 3, 4, 5, 6, 8, 22}
{1, 3}
{0, 8, 22}
{0, 1, 3, 8, 22}
True
True


# list是无序的
list_1.add(9999)
print(list_1)
list_1.update([888,777,666])
print(list_1)
结果:
{1, 2, 3, 4, 5, 6, 9999}
{1, 2, 3, 4, 5, 6, 777, 9999, 888, 666}

#删除一项
list_1.remove(9999)
# list_1.pop() 随机

#集合的长度
len(list_1)

#测试x是否为s的成员
x in s

#测试x是否不是s的成员
x not in s  

#测试是否 s 中的每一个元素都在 t 中  
s.issubset(t)  
s <= t  

#测试是否 t 中的每一个元素都在 s 中 
s.issuperset(t)  
s >= t  

#返回一个新的 set 包含 s 和 t 中的每一个元素
s.union(t)  
s | t  
  
#返回一个新的 set 包含 s 和 t 中的公共元素  
s.intersection(t)  
s & t  

#返回一个新的 set 包含 s 中有但是 t 中没有的元素  
s.difference(t)  
s - t  

#返回一个新的 set 包含 s 和 t 中不重复的元素  
s.symmetric_difference(t)  
s ^ t  

#返回 set “s”的一个浅复制
s.copy()  
  

 

5.文件操作

对文件操作流程
1.打开文件,得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.关闭文件

现有文件如下

It keeps me awake
这一切让我彻夜难眠
The look on your face
你脸上的那表情
The moment you heard the news
你听到新闻的那一瞬间
You're screaming inside
你的内心在嘶吼
And frozen in time
时间一霎那凝结
You did all that you could do
你已经做了所有
The game was rigged, the ref got tricked
而游戏被操纵 裁判被愚弄
Only the young can run (Can run)
唯有这一代人可以逃出生天
So run
那么就奔跑吧
And run and run
继续狂奔 不要再停下

基本操作
第一种:

# 打开文件
f = open('Taylor.txt','r+')  # 打开文件
first_line = f.readline()
print('first line:', first_line)  # 读一行
print('我是分隔线'.center(50, '-'))
data = f.read()  # 读取剩下的所有内容,文件大时不要用
print(data)  # 打印文件
f.write("\nTaylor Swifts")
print(data)  # 打印文件

f.close()  # 关闭文件

第二种:

f = open('Taylor.txt','r+')  # 打开文件

first_line = f.readline()
print('first line:', first_line)  # 读一行
print('我是分隔线'.center(50, '-'))
# 高效率,一行一行读。
count = 0
for line in f:
    if count == 9:
        print('----------我是插入的----------')
        count += 1
        continue
    print(line.strip())
    count += 1
f.close()  # 关闭文件

第三种:修改

文件修改
改了之后写到新文件
循环一行一行读,每一行判断,就把这句话插入,然后写到新文件
f = open('Taylor.txt','r')  # 打开文件
f_new = open("Taylor-backup.txt","w")

for line in f:
    if "这一切让我彻夜难眠" in line:
        line = line.replace("这一切让我彻夜难眠","这一切让果子哥彻夜难眠")
    f_new.write(line)
f.close()
f_new.close()

其他

#文件指针
print(f.tell())  打印位置

#位置偏移
f.seek(0)  
file.seek()方法标准格式是:seek(offset,whence=0)
offset:开始的偏移量,也就是代表需要移动偏移的字节数
whence:给offset参数一个定义知,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前道位置开始算起,2代表从文件末尾算起。默认为0 
f.seek(-3, 2)  # 移动到文件倒数第三个字节
如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。


read([size])方法从文件当前位置起读取size个字节,若无参数size,则表示读取至文件结束为止,它范围为字符串对象
readline()方法每次读出一行内容,所以,读取时占用内存小,比较适合大文件,该方法返回一个字符串对象。
readlines()方法读取整个文件所有行,保存在一个列表(list)变量中,每行作为一个元素,但读取大文件会比较占内存

f.encoding()  文件的编码
f.flush()  刷新
额外对flush进行一种扩展
import sys,time
for i in range(20):
    sys.stdout.write("#")
    sys.stdout.flush()
    time.sleep(0.1)
因为刷新缓冲,结果是逐渐出现# ,如果没有就会等缓冲区满了才一次性打出。


f.truncate()方法用于从文件的首行首字节开始截断,截断文件为 size 个字节,无 size 表示从当前位置截断;截断之后 V 后面的所有字节被删除
 

打开文件的模式有:

r,只读模式(默认)。
w,只写模式。【不可读;不存在则创建;存在则删除内容;】
a,追加模式。【可读; 不存在则创建;存在则只追加内容;】

“+” 表示可以同时读写某个文件

r+,可读写文件。【可读;可写;可追加】
w+,写读
a+,同a 追加读

"U"表示在读取时,可以将 \r \n \r\n自动转换成 \n (与 r 或 r+ 模式同使用)

rU
r+U

"b"表示处理二进制文件(如:FTP发送上传ISO镜像文件,linux可忽略,windows处理二进制文件时需标注)

rb    网络传输
wb
ab

with语句
为了避免打开文件后忘记关闭,可以通过管理上下文,即:

with open('log','r') as f:

打开多个文件的方法
with open("Taylor.txt","r") as f,\
    open("Taylor-backup.txt","r") as f2:

程序练习 
和上面的第三种 类似 
程序1:实现简单的shell sed替换功能
程序2:修改haproxy配置文件

程序1: 实现简单的shell sed替换功能

文件修改
改了之后写到新文件
循环一行一行读,每一行判断,就把这句话插入,然后写到新文件
import sys
f = open('Taylor.txt','r+')  # 打开文件
f_new = open("Taylor-backup.txt","w")
find_str=sys.argv[1]
replace_str=sys.argv[2]
for line in f:
    line = line.replace(find_str,replace_str)
    print(line)
    f_new.write(line)
f.close()
f_new.close()  

在终端中运行   F:\python3学习>python day2.py T *   
这里T代表被替换参数,*代表替换参数。  

程序2:修改haproxy配置文件
需求:

功能实现:
1、输入相关网址,可查询相关记录信息;
2、按照字典样式输入网址及记录信息,可在haproxy文件中增加;
3、输入相关网址,可删除相关记录信息;
4、按照字典样式输入网址及记录信息,可在haproxy文件中更新。

思路:
1.search
2.add
3.update
4.delete

1、查
    输入:www.oldboy.org
    获取当前backend下的所有记录

2、新建  
    输入: 通过字典规范了,
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }

3、删除
    输入:
        arg = {
            'bakend': 'www.oldboy.org',
            'record':{
                'server': '100.1.7.9',
                'weight': 20,
                'maxconn': 30
            }
        }

需求

原配置文件

global       
        log 127.0.0.1 local2
        daemon
        maxconn 256
        log 127.0.0.1 local2 info
defaults
        log global
        mode http
        timeout connect 5000ms
        timeout client 50000ms
        timeout server 50000ms
        option  dontlognull

listen stats :8888
        stats enable
        stats uri       /admin
        stats auth      admin:1234

frontend oldboy.org
        bind 0.0.0.0:80
        option httplog
        option httpclose
        option  forwardfor
        log global
        acl www hdr_reg(host) -i www.oldboy.org
        use_backend www.oldboy.org if www

backend www.oldboy.org
        server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000

原配置文件
eval
a = "[[1,2], [3,4], [5,6], [7,8], [9,0]]"
b = eval(a)
print(b)
结果:[[1, 2], [3, 4], [5, 6], [7, 8], [9, 0]]
完整程序:
def show_red(show_str):
    print("\033[3;31m{}\33[0m".format(show_str))

def if_continue():
    """ 询问是否继续 """
    if_cont = input("Do you want to continue ? [y/n]")
    if if_cont == 'y':
        pass
    else:
        exit()

def show_result(show_str):
    """ 显示特定的颜色 """
    print("\033[34;1m{}\033[0m".format(show_str).center(50, '-'))

def search():
    """ 搜索信息 """
    website = input("please enter the url you want to query: ")
    if website in file_content.keys():   # dict.keys() 以列表返回一个字典所有键
        show_result("查询信息")
        show_red(file_content[website])
    else:
        show_red("sorry,the information you want to inquire could not be founded!")

def add():
    # {'backend': 'www.baidu.org','record':{'server': '100.1.7.9','weight': 20,'maxconn': 30}}
    add_str = input('请输入要添加的记录:\n')
    add_dict = eval(add_str)   # 字符串转字典
    print(add_dict)
    with open("haproxy.txt", "a+") as f:
        f.write("\nbackend {} \n\t\tserver {} weight {} maxconn {}".format(add_dict['backend'],
                                                                           add_dict['record']['server'],
                                                                           add_dict['record']['weight'],
                                                                           add_dict['record']['maxconn']))
def delete():
    show_result("可删除的网页")
    for name in file_content.keys():
        print(name)
    user_order = input("请输入你想删除的url:\n")
    if user_order in file_content.keys():
        with open("haproxy.txt", "a+", encoding='utf-8') as Handle_file:
            Handle_file.seek(0)
            lines = Handle_file.readlines()
            index = lines.index("backend {}\n".format(user_order))
            del lines[index]
            del lines[index]
            Handle_file.seek(0)
            Handle_file.writelines(lines)
        show_red("删除网页成功")
    else:
        show_red("该网页不存在")

while True:
    file_content = {}
    f = open('haproxy.txt',"r+")
    for line in f:
        if "backend" in line and "use_backend" not in line:
            # 默认 以空格为分隔符,包含 \n,拆分将会形成一个字符串的数组并返回
            # [1]取出数组中第二个元素的值,www.oldboy.org
            # www.oldboy.org作为key 放在字典中,#换行后的server作为value# 这里不是很懂,记住把
            file_content[line.split()[1]] = f.readline().strip()
            print(file_content)
    user_choice = input("1.search\n2.add\n3.delete\n4.quit\n:")
    if user_choice == "4":
        show_red("软件已退出")
        exit()
    elif user_choice == "1":
        search()
        if_continue()
    elif user_choice == "2":
        add()
        if_continue()
    elif user_choice == "3":
        delete()
        if_continue()
    else:
        show_red("请重新输入")
        if_continue()
    f.close()

 

6.字符编码与转码

Python编码终极版:https://www.cnblogs.com/yuanchenqi/articles/5956943.html .

1.在python2默认编码是ASCII, python3里默认是unicode

2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间

3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
Python 3:默认就是Unicode

文件头:与文件编码一致
#-*- coding:gbk -*-

在这里插入图片描述

下图仅适用于Python 2:
在这里插入图片描述Python编码终极版:https://www.cnblogs.com/yuanchenqi/articles/5956943.html .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python中,异常处理是非常重要的一部分。当程序运行时如果出现错误,如果没有异常处理,程序就会崩溃。为了避免这种情况,Python提供了异常处理机制。 在Python中,异常处理语句使用 `try` 和 `except` 关键字来实现。`try` 语句块中包含可能会发生异常的代码,如果这段代码出现了异常,则会跳转到 `except` 语句块中执行异常处理代码。 下面是一个简单的例子: ```python try: num = int(input("请输入一个整数:")) print(10/num) except ZeroDivisionError: print("除数不能为0") except ValueError: print("输入的不是整数") ``` 在上面的代码中,我们尝试将用户输入的字符串转换为整数,并将其用作除数计算 10/num。如果用户输入的是 0,则会触发 ZeroDivisionError 异常。如果用户输入的不是整数,则会触发 ValueError 异常。如果发生异常,则会跳转到对应的 except 语句块中执行处理代码。 除了可以指定具体的异常类型,也可以使用 `except Exception` 来捕获所有异常。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) ``` 在上面的代码中,如果发生任何异常,都会跳转到 `except` 语句块中执行处理代码,并将异常信息打印出来。 除了 `try` 和 `except`,还有 `finally` 关键字,它指定的代码块无论是否发生异常都会执行。例如: ```python try: num = int(input("请输入一个整数:")) print(10/num) except Exception as e: print("发生异常:", e) finally: print("程序执行完毕") ``` 在上面的代码中,无论是否发生异常,都会执行 `finally` 中的代码,即输出“程序执行完毕”。 总之,在Python中,异常处理是非常重要的一部分,它可以有效避免程序崩溃,提高程序的健壮性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值