关于编码的问题:

in python3中:对于英文、数字:utf8  1个bytes(字节)对于一个字符

unicode  3个bytes(字节)对应一个字符

encode:编码  将Unicode形式转化为utf-8等其他形式

decode:解码  将utf-8等其他形式转化为Unicode形式

Unicode形式的字符串的type是str,utf-8等其他形式的字符串的type是bytes;

Uincode就是我们看到的字符本身,utf-8等其他形式是存储进文件时的格式。

在涉及与文件、网页交互时,才会涉及到编码解码。


 

十三、文件操作

能调用方法的一定是对象:列表、字典、字符串,文件也属于对象。

1.打开文件

with open() as name  这样打开就不需要用close()函数了。

open('路径','操作方式')

1)路径:

''     : 当前同级目录

'/'    :根目录

'./'   :当前同级目录

'../'  :上级目录

①绝对路径:完整的描述文件位置的路径

②相对路径:由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。 

2)操作方式:

①'r'   >>只读操作

②'w'  >>只写操作  打开文件后就把文件里的内容清空了

③'a'  >>添加操作  不清空,在后面添加

④‘r+’   >>读写模式     必须是先读. 因为默认光标是在开头的. 准备读取的. 当读完了了之后再进行写入,常用 

⑤'w+'  >>写读模式  先将所有的内容清空,然后写入,最后读取。

⑥'a+'   >>追加读   不论先读还是后读,都读取不到数据。因为光标在最后面啊。

2.文件的方法:

1)read()   >>读操作

  参数:不加的话,默认全部读出来;

  加,一个字符==一个字节

readline()   >>一行一行的读

2)write()

写操作

3)close()    >>关闭文件

  用open打开的文件就需要用close关闭文件,

因为对文件进行操作时解释器可以关,但不能准确的关,所以有风险。

4)tell()  >>打印光标的位置

  英文:一个字节 == 一个字符

  中文:三个字节 == 一个字符

及中文的话,打印一个字符会出现3而不是1

5)seek()  >>调整光标的位置

  参数为  调整的位置

6)truncate() >>截断,不给参数从文件开头截断到当前位置,其余内容删除;

        给参数,将从开头开始截断指定长度,其余内容删除。

7)flush()  >>把缓存里的数据放入内存中

  用法:做一个进度条


多级菜单程序优化代码:

menu = {
    '广东':{
        '广州':{
            '越秀区':{'东湖','白云','大东'},
            '白云区':{'三元里','同和','永平'},
            '天河区':{'沙东','沙河','黄村'},
        },
        '深圳':{
            '南山区':{'西丽','沙河','水湾'},
            '福田区':{'福田','梅林','华强北'},
            '龙岗区':{'龙岗','龙城','横岗'},
        },
        '汕头':{
            '潮南区':{'陈店','两英','司马浦'},
            '龙湖区':{'珠池','新津','金霞'},
            '濠江区':{'河浦','玉新','达濠'}
        },
    },
    '浙江':{
        '杭州':{
            '上城区':{'湖滨','清波','望江'},
            '临安区':{'青山湖','锦城','玲珑'},
            '西湖区':{'北山','灵隐','文新'},
        },
        '宁波':{
            '镇海区':{'庄市','骆驼','蛟川'},
            '北仑区':{'春晓','梅山','郭巨'},
            '奉化区':{'锦屏','江口','尚田'},
        },
        '温州':{
            '龙湾区':{'永中','海城','沙城'},
            '鹿城区':{'五马','滨江','七都'},
            '洞头区':{'东屏','灵昆','元觉'}
        },
    },
    '安徽':{
        '合肥':{
            '蜀山区':{'西园','稻香村','南七'},
            '瑶海区':{'三里街','明光路','和平路'},
            '庐阳区':{'十字街','新华街','中山街'},
        },
        '安庆':{
            '迎江区':{'龙狮桥乡','长风乡','青龙'},
            '大观区':{'德宽路','菱湖','集贤路'},
        },
        '淮北':{
            '相山区':{'东山','相南','三堤口'},
            '烈山区':{'杨庄','任楼','古饶'},
            '杜集区':{'高岳','朔里','石台'}
        },
    },
}
current_dict = menu
parent_list = []
condition = True
while condition:
    for keys in current_dict:
        print(keys)
    choice = input('请输入您要进入的地方:').strip()
    if choice in current_dict:
        parent_list.append(current_dict)
        current_dict = current_dict[choice]
    elif choice == 'q':
        print('程序已退出,谢谢使用。')
        condition = False
    elif choice == 'r':
        print('已返回上一级,请输入您要进入的地方:')
        if parent_list:
            current_dict = parent_list.pop()
    else:
        print('无此项,请重新输入您要进入的地方:')

有些瑕疵,不过确实完成了返回上一级,以及随时退出程序。
同样的程序,比起上一个,代码量少多了。
不过,只要能做出来就好了,现在还只是学习阶段,代码重构那是以后的事。