# # 面试题
# res = {}.fromkeys(['name','pwd','age'],123)
# print(res) # 结果为 {'name': 123, 'pwd': 123, 'age': 123}
# res['name'] = 'xiao'
# print(res) # 结果为 {'name': 'xiao', 'pwd': 123, 'age': 123}
# print(id(res['name']),id(res['pwd'])) # 结果为 2375983335384 1985379616
#
# res = {}.fromkeys(['name','pwd','age'],[])
# print(res) # 结果为 {'name': [], 'pwd': [], 'age': []}
# res['name'].append('xiao')
# print(res) # 结果为 {'name': ['xiao'], 'pwd': ['xiao'], 'age': ['xiao']}
# print(id(res['name']),id(res['pwd'])) # 结果为 2375983346312 2375983346312
# # 当用formkeys后面跟key列表,和固定的value值,来快速创建字典时候
# # 变量 = {}空字典.fromkeys(['key1','key2'],v) 创建的字典,key依次为列表中的值,value都为一样的v
# # 字典中value的值可以是任意数据类型,key的值为不可变数据类型
# # 当用formkeys()快速创建字典时,创建出来的字典中,value在内存中只存一份,所有的key都指向这一个地址
# # 即所有的key取出来的值,id相同
# #上下两种情况:
# # 第一种情况value为不可变数据类型
# # 当一个key的value改变时,改变的key指向其他新的内存地址,其他key的value不变,即其他key的指向不变,因为value不可变
# # 第二种情况value为可变数据类型
# # 当一个key的value改变时,这个value的内存地址不变,内存中的值改变,其他key的value一起变,因为其他key也指向这个内存地址
# # update 更新
# d1 = {'name':'jason','age':18}
# d2 = {'name':'egon','hobby':'haha','age':18}
# d1.update(d2)
# print(d1) # 结果为 {'name': 'egon', 'age': 18, 'hobby': 'haha'}
# # uodate()更新的使用,如果新字典中有原字典没有的key,则新增新字典中的键值对,到原字典中
# # uodate()更新的使用,如果新字典中有原字典有的key,且value不一致,则更改原字典中的value为新的value
# # uodate()更新的使用,如果新字典中有原字典有的key,且value一致,则忽略该键值对
# # for i in 1:
# # pass # 会报错 整型不支持for循环 TypeError: 'int' object is not iterable
# # list(1) # 会报错 整型不支持for循环
# # set(1 ) # 会报错 整型不支持for循环
# # tuple(1) # 会报错 整型不支持for循环
# # # 元组 列表,集合转换时,转换的数据类型需要支持for循环,否则不可转换为 列表 元组 集合
# # # 因为他们的本质都是for循环取值,然后再放入容器
# s = 'hello world'
# print(list(s)) # 结果为 ['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd']
# print(set(s)) # 结果为 {'r', ' ', 'l', 'w', 'd', 'e', 'h', 'o'}
# print(tuple(s)) # 结果为 ('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd')
# 字符编码
'''
字符编码针对的是文字,字符编码只跟文本文件有关
需要考虑 视频文件 音频文件等其他文件吗? 不需要
文本编辑器的输入和输出是两个过程,即手打编辑和显示器输出时两个过程
所有的编码都支持英文字符
ASCII码表 对应 英文字符 和 二进制 8个bit位 = 1Bytes 对应一个字符
GBP表 对应 中文字符 英文字符 和 二进制 16个bit位 = 2 Bytes 对应一个字符
unicode 万国码,对应各国的编码表 和二进制 16个bit位 = 2 Bytes 对应一个字符
# unicode 缺点: 1 英文也用16个比特位表示,浪费空间 2 IO效率低一倍 适用于内存中,因为写兼容万国
需要掌握的)
unicode的两个特点:
1.用户在输入的时候,无论输什么字符都能够兼容万国字符
2.其他国家编码的数据由硬盘读到内存的时候unicode与其他各个国家的编码都有对应关系
UTF-8 unicode优化的编码格式,硬盘中的编码格式
会将unicode的英文字符由原来的2Bytes变成1Bytes
会将unicode的中文字符由原来的2Bytes变成3Bytes
# UTF-8 优点:英文1bytes 中文3 bytes 传输效率高 适用于磁盘中,因为传输效率高
现在的计算机
内存都是unicode
硬盘都是utf-8
保证不乱码在于
文本文件以什么编码编的就以什么编码解
运行程序的三个核心硬件 : CPU 内存 硬盘
任何一个程序想要运行,都需要先从硬盘中将数据加载到内存,然后CPU在内存取指执行
运行中产生的数据必然先存在内存中
python解释器运行一个py文件(xxx.py)步骤
1.将python解释器的代码由硬盘读到内存
2.将xxx.py以普通文本文件形式读到内存
3.python读取文件内容 识别python语法 执行相应操作
ps:普通的文本编辑器与python解释器前两步都是一样的
'''
'''
(必须掌握的)
内存中的数据由内存保存到硬盘 内存 到 硬盘 unicdoe → UTF-8
内存中的unicode格式二进制数字 >>>>编码(encode)>>>>> utf-8格式的二进制数据
硬盘中的数据由硬盘读到内存 硬盘 到 内存 UTF-8 → unicode
硬盘中的utf-8格式的二进制数据 >>>>>解码(decode)>>>>> 内存中unicode格式的二进制数据
保证不乱码在于
文本文件以什么编码编的就以什么编码解
python2 将py文件按照文本文件读入解释器中默认使用ASCII编码
python3 将py文件按照文本文件读入解释器中默认使用UTF-8编码
pycharm终端用的是utf-8格式
windows终端采用的是gbk
python2 ASCII编码
python3 UTF-8编码
pycharm终端 UTF-8编码
windows GBK编码
python3中字符串默认就是unicode编码格式的二进制数
文件头 书写格式:
# coding:utf-8
作用: 从硬盘中读取文件时,使用哪种字符编码,用哪种编码存的,就需要用哪种编码读取
保证不乱码在于 文本文件以什么编码编的就以什么编码解
'''
# python3中字符串默认就是unicode编码格式的二进制数
# # 基于Python解释器开发的软件,只要是中文,前面都需要加一个u,意思是存为 unicode,
# # 因为unicode 可以对应所有编码表
# s = '今天是个好日子'
# print(s)
# # 用python2.7解释器运行 会报错 SyntaxError: Non-ASCII character
# # 因为python2默认用的时ASCII,不识别汉字,汉字和二进制没有对应关系
'''
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:19:30) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> x = u"上"
>>> print x
上
>>> print type(x)
<type 'unicode'>
>>>
'''
# # python3中字符串默认就是unicode编码格式的二进制数
# x = u'上'
# res = x.encode('utf-8')
# print(res) # 结果为 b'\xe4\xb8\x8a' bytes类型 字节串类型 二进制数据
# print(type(res)) # 结果为 <class 'bytes'>
# # 将unicode编码成可以存储和传输的utf-8的二进制数据 内存 到 硬盘 存储 编码
# res2 = res.decode('utf-8')
# print(res2) # 结果为 上
# print(type(res2)) # 结果为 <class 'str'>
# # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据 硬盘 到 内存 读取 解码
# # python3中字符串默认就是unicode编码格式的二进制数
# x = u'上'
# res = x.encode('gbk')
# print(res) # 结果为 b'\xc9\xcf' bytes类型 字节串类型 二进制数据
# print(type(res)) # 结果为 <class 'bytes'>
# # 将unicode编码成可以存储和传输的utf-8的二进制数据 内存 到 硬盘 存储 编码
# res2 = res.decode('gbk')
# print(res2) # 结果为 上
# print(type(res2)) # 结果为 <class 'str'>
# # 将硬盘中的utf-8格式的二进制数据解码成unicode格式的二进制数据 硬盘 到 内存 读取 解码
# a = u'你a他'
# print(a.encode('utf-8'))
# # 结果为 b'\xe4\xbd\xa0a\xe4\xbb\x96'
# # 1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes|1Bytes
# # 1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit|1+7bit
# # 1为标记位,标识和前后哪几个是一组,utf-8中中文三个bytes位,英文一个bytes位
# 文件处理
# 通过python代码操作文件
"""
什么是文件?
操作系统提供给用户操作复杂硬件(硬盘)的简易的接口
为什么操作文件
人或者应用程序需要永久的保存数据
如何用
f = open() 打开一个文件,需要其绝对path
f.read() 一次性读取文档全部内容
f.close() 告诉操作系统关闭打开的文档
open(r'绝对路径',mode='rt'encoding='utf-8')
# 文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下
"""
# f.read() 一次性读取文档全部内容
# f.close() 告诉操作系统关闭打开的文档
# open(r'绝对路径',mode='rt'encoding='utf-8')
# f = open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt',encoding='utf-8')
# print(f) # f 是 文件对象 (文件的遥控器)
# # 结果为 <_io.TextIOWrapper name='D:\\python10期\\python脱产10期视频\\day07\\代码\\day07\\a.txt' mode='r' encoding='utf-8'>
# # f1 = open(D:\python10期\python脱产10期视频\day07\代码\day07\a.txt,encoding='utf-8')
# # print(f1) # 会报错 SyntaxError: invalid syntax
# # 当需要打开的文件的绝对路径和文件名中有空格或者特殊字符,转义字符,就把它用引号引起来,前面加个r
# # r'' 意思为取消转义
# print(f.read()) # 打印文件中全部内容
# f.read() # 向操作系统发请求 读取文件内容
# print(f.read()) # 读一遍之后,在调这个方法打印文件内容就打印不出来了
# print(f.read()) # 因为读一遍之后,文件的光标就在文件最后了,再读没有内容了
# print(f.read())
# f.read() 读取文件一次之后,光标在最后,不能再次读取,文件也不会自动关闭,需要告诉操作系统关闭文件
# # f.close() # 告诉操作系统 关闭打开的文件
# f = open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt',encoding='utf-8')
# f.close()
# print(f.read())
# # 结果会报错 ValueError: I/O operation on closed file. 说文件已经关闭了
# with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt',encoding='utf-8') as f:
# print(f.read())
# print(f.read()) # 会报错 ValueError: I/O operation on closed file. 文件已关闭
# with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt',encoding='utf-8') as f:
# with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt', encoding='utf-8') as f1:
# print(f.read())
# print(f1.read())
# # 结果是读取两次该文件
# # with open(r'绝对路径',encoding='utf-8') as f: print(f.read())
# # 这个方法打开文件时,下面会有子代码块,运行完子代码块之后会关闭该文件,再进行下面的同级别代码块
"""
文件打开的模式
r 只读模式
w 只写模式
a 追加写模式
操作文件单位的方式
t 文本文件 t在使用的时候需要指定encoding参数 如果不知道默认是操作系统的默认编码中国windows默认时gbk
b 二进制 一定不能指定encoding参数,因为已经时二进制数据,不需要
# open(r'绝对路径',mode='rt'encoding='utf-8') 只读的文本文件 不写mode默认就是这个
# open(r'绝对路径',mode='rb'encoding='utf-8') 只读二进制文件......
# 文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下
# mode参数 可以不写 不写的话默认是rt 只读的文本文件 这个t不写默认就是t
"""
# with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\a.txt',mode='r',encoding='utf-8') as f:
# print(f.readable()) # 判断是否可读 结果为 True
# print(f.writable()) # 判断是否可写 结果为 False
# print(f.read()) # 一次性将文件内容全部读出
# # with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\1.jpeg',mode='r',encoding='utf-8') as f:
# # print(f.readable()) # 判断是否可读 结果为 True
# # print(f.writable()) # 判断是否可写 结果为 False
# with open(r'D:\python10期\python脱产10期视频\day07\代码\day07\1.jpeg', mode='rt', encoding='utf-8') as f:
# print(f.read()) # 会报错 图片不可用这个方式读
# r模式下
# # 文件路径可以写相对路径 但是需要注意该文件必须与执行文件在同一层文件下
# with open(r'c.txt',mode='r',encoding='utf-8') as f:
# print(f.readable()) # 是否可读
# print(f.writable()) # 是否可写
# print(f.read())
# # r模式下 如果需要打开的文件不存在则报错
# # 报错 :FileNotFoundError: [Errno 2] No such file or directory: 'c.txt'
# with open(r'a.txt','r',encoding='utf-8') as f: # mode关键字可以不写
# print(f.read()) # 一次性将文件内容全部读出
# print('>>>1:')
# print(f.read()) # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
# print('>>>2:')
# # 打印结果为 有内容 >>>1: >>>2:
# # 读完一次之后 文件的光标已经在文件末尾了,再读就没有内容了可读
# with open(r'a.txt', 'r', encoding='utf-8') as f:
# print(f.readlines())
# # 结果为 ['发数据福建师范\n', '上午翻车了\n', '我很是恼火\n', '房价都是大飞机就是大富科技']
# # 返回的是一个列表,列表中的一个个元素对应的就是文件的一行行内容
# with open(r'a.txt', 'r', encoding='utf-8') as f: # 循环一次从文件中取出一行
# for line in f: # f可以被for循环 每for循环依次 读一行内容
# print(line) # 这个方法 就可以解决大文件一次性读取占用内存过高的问题
# f.readline() 一行一行读取文件中内容
# with open(r'a.txt', 'r', encoding='utf-8') as f:
# print(f.readline()) # 返回结果第一行内容 只读取文件一行内容
# print(f.readline()) # 返回结果第一行内容 只读取文件一行内容
# print(f.readline()) # 返回结果第一行内容 只读取文件一行内容
# print(f.readline()) # 返回结果第一行内容 只读取文件一行内容
# # w模式:w模式一定要慎用
# # 1.文件不存在的情况下 自动创建该文件
# # 2.当文件存在的情况下 会先清空文件内容再写入
# with open(r'c.txt',mode='w',encoding='utf-8') as f:
# # print(f.readable()) # 是否可读
# # print(f.writable()) # 是否可写
# # f.write('haha1\n') # \n 是换行符
# # f.write('haha2\r') # \r 是换行符
# # # 首先py文件当前目录下没有需要打开的这个文件c.txt,则创建一个,然后开始写一次一行,因为有换行符
# # # 其次py文件当前目录下有需要打开的这个文件c.txt,则会先清空这个文件,然后再写,一次一行,因为有换行符
# # # 最后c.txt文件中有两行内容 : haha1 haha2
# with open(r'c.txt',mode='w',encoding='utf-8') as f:
# l = ['haha1','haha2']
# f.writelines(l)
# # 首先py文件当前目录下没有需要打开的这个文件c.txt,则创建一个,然后开始写,都写在一行,因为没有换行符
# # 其次py文件当前目录下有需要打开的这个文件c.txt,则会先清空这个文件,然后再写,都写在一行,因为没有换行符
# with open(r'c.txt',mode='w',encoding='utf-8') as f:
# l = ['haha1', 'haha2']
# for i in l:
# f.write(i)
# # 首先py文件当前目录下没有需要打开的这个文件c.txt,则创建一个,然后开始写,都写在一行,因为没有换行符
# # 其次py文件当前目录下有需要打开的这个文件c.txt,则会先清空这个文件,然后再写,都写在一行,因为没有换行符
# # a 追加模式
# # 1.当文件不存在的情况下 自动创建该文件
# # 2.当文件存在的情况下,不清空文件内容, 打开文件,文件的光标会移动文件的最后
# with open(r'd.txt',mode='a',encoding='utf-8') as f:
# print(f.readable()) # 是否可读
# print(f.writable()) # 是否可写
# f.write('我是小尾巴1\n')
# f.write('我是小尾巴2\n')
# # 执行一次多两行,因为加入内容中有换行符,追加模式,执行一次 追加一次
# # 首先py文件当前目录下没有需要打开的这个文件d.txt,则创建一个,然后开始写
# # 2.当文件存在的情况下,不清空文件内容, 打开文件,文件的光标会移动文件的最后,在文件最后开始写,不会清空文件原数据