数据类型(dict,set)和文件操作

dict 类'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'
dic = {"k1":"v1",}
字典的key都能是什么
数字,字符串,布尔值,元组都可以(原值都是不可变的) 列表 字典 集合不可以(属于可变的) #布尔值里的True=1,False=0,,不能同时写,一样的
dict 的查找速度很快,可以认为查找时一次就能找到,查找时会做成一个哈希表,有哈希索引,经过哈希计算之后key值会变成一个内存地址,查找时直接找内存地址

功能
clear 清空
copy(和列表一样)
pop("key","默认值") 删掉key值对应的值,并取出来,,,key不存在时报错,加了默认值,就不会报错,打印默认值
popitem() 随机删掉键值对 操作完位为元组类型
setdefalut("key","value") 设置:只添加不修改,有key时,不改变
update({"key":"value"}) 更新 不存在加进去,存在时更新

重点 类.fromkeys() dict.fromkeys() 生成一个字典
val = dict.fromkeys(["k1","k2","k3"],value)
value 是一个可变数据类型时,对val做操作后,所有的key对应的value都变化
是一个不可变类型时,更改其中一个时不会全部改变,只改变其中一个
 
dict 类'clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values'

clear 清空
d = {"k1":"v1","k2":"v2","k3":"v3"}
d.clear()
print(d)

#copy  浅拷贝  只拷贝最外层,指向同一块内存
****单个字典时,在只有数字,字符串的时候,深浅拷贝一样****
d1 = {"k1":"v1","k2":"v2","k3":"v3"}
d2 = d1.copy()        #这里是重新创建了一个字典,但是字典内的元素指向同一个内存
print(d2)
d1["k1"] = 666
print(d1)
print(d2)

import copy 深拷贝#    所有层都拷贝,最后一层补不拷贝,改变后不一样
****单个字典时,在只有数字,字符串的时候,深浅拷贝一样****
import copy
d1 = {"k1":"v1","k2":"v2","k3":"v3"}
d2 = copy.deepcopy(d1)        #这里是重新创建了一个字典,
print(d2)
d1["k1"] = 666
print(d1)
print(d2)

*****嵌套时才有区别*****
浅拷贝
d1 = {"k1":[11,22,33],"k2":"v2","k3":"v3"}
d2 = d1.copy()        #这里是重新创建了一个字典,但是字典内的元素指向同一个内存
print(d2)
d1["k1"].append(666)        #因为指向同一个内存,所以d1改变d2也会改变
print(d1)
print(d2)
#
深拷贝
import copy
d1 = {"k1":[11,22,33],"k2":"v2","k3":"v3"}
d2 = copy.deepcopy(d1)        #这里是重新创建了一个字典,d1 d2 指向不同的内存
print(d2)
d1["k1"] = 666      #因为指向不同的内存,所以d2不会改变
print(d1)
print(d2)

 重点 类.fromkeys()    dict.fromkeys()     生成一个字典
value 是一个可变数据类型时,对val做操作后,所有的key对应的value都变化
是一个不可变类型时,更改其中一个时不会全部改变,只改变其中一个
val = dict.fromkeys(["k1","k2","k3"],6666)
print(val)
val["k1"] = "aaa"
print(val)

val = dict.fromkeys(["k1","k2","k3"],[11,22,33])
print(val)
val["k1"].append("qqqq")
print(val)

get()  取到key,没有时返回None
d = {"k1":"v1","k2":"v2","k3":"v3"}
print(d.get("k2"))

keys() 取到所有key 常和for循环一起用
d = {"k1":"v1","k2":"v2","k3":"v3"}
for v in d.keys():
    print(v)

values() 取到所有value 常和for循环一起用
d = {"k1":"v1","k2":"v2","k3":"v3"}
for v in d.values():
    print(v)

items() 取到所有键值对 常和for循环一起用
d = {"k1":"v1","k2":"v2","k3":"v3"}
for v in d.items():
    print(v)


pop("key","默认值")  删掉key值对应的值,并取出来,,,key不存在时报错,加了默认值,就不会报错,打印默认值
d = {"k1":"v1","k2":"v2","k3":"v3"}
v = d.pop("k2")
print(v)
print(d)

d = {"k1":"v1","k2":"v2","k3":"v3"}
v = d.pop("k12",888)
print(v)
print(d)

popitem()  随机删掉键值对  操作完为元组类型
d = {"k1":"v1","k2":"v2","k3":"v3"}
v1,v2 = d.popitem()
print(v1,v2)
print(d)

setdefalut("key","value")   设置:只添加不修改,有key时,不改变
d = {"k1":"v1","k2":"v2","k3":"v3"}
d.setdefault("k5","v5")
print(d)

d = {"k1":"v1","k2":"v2","k3":"v3"}
d.setdefault("k2","v5")
print(d)

update({"key":"value"})  更新  不存在加进去,存在时更新
d = {"k1":"v1","k2":"v2","k3":"v3"}
d.update({"k2":"v5"})
print(d)

d = {"k1":"v1","k2":"v2","k3":"v3"}
d.update({"k5":"v5"})
print(d)
字典

 

数据类型基本形式
v1 = [] #v1 = list()
v2 = () #v2 = tuple()
v3 = {} #v3 = dict()  默认字典
v4 = set()     #集合

 

集合
set 类 di = {"k1","k2"} 集合 是无序的 所有的元素都是唯一的 可以for,可以取长度,不可以索引
集合是可变的 要求集合里的元素是不可变的,
add() 添加,如果存在不添加
copy()
差集(后面的元素一般是可迭代对象)
v.difference(n) v中存在n中不存在的数据,并取出
v.difference_update(n) 找到v中存在n中不存在的数据,并更新v中的值,
对称差集
v.symmetric_difference(n) 去掉v,n中相同的元素,并取出
v.symmetric_difference——update(n) 去掉v,n中相同的元素,并更新v中的值
交集
intersection()
intersection_update()
并集
union()
isdisjoint() 有交集False,没有True
v.issubset(n) 判断v是否是n的子集
v.issuperset() 判断v是否是n的父集
删除集合元素
pop() 随机删除
remove() 没有时报错
discard() 没有时不报错
update() 更新 不用接收

集合
set 类 s = {"a1","a2"} 集合 是无序的 并且没有重复元素,所有的元素都是唯一的
可以for,可以取长度,不可以索引
  集合是可变的   要求集合里的元素是不可变的,
add()      添加,如果存在不添加
s = {"a1","a2"}
s.add("a3")
print(s)

#copy  浅拷贝  只拷贝最外层,指向同一块内存
****单个集合时,在只有数字,字符串的时候,深浅拷贝一样****
s = {"a1","a2"}
s1 = s.copy()         #重新创建了一个集合,
print(s1)
s.add("a3")           #所以s改变,s1不改变
print(s)
print(s1)

import copy 深拷贝#    所有层都拷贝,最后一层补不拷贝,改变后不一样
****单个集合时,在只有数字,字符串的时候,深浅拷贝一样****
import copy
s = {"a1","a2"}
s1 = copy.deepcopy(s)     #重新创建了一个集合,
print(s1)
s.add("a3")           #所以s改变,s1不改变
print(s)
print(s1)

*****嵌套时才有区别*****
#copy  浅拷贝  只拷贝最外层,指向同一块内存
重新创建了一个集合,但是集合中的元素指向一个内存,,所以会都改变

import copy 深拷贝 出最后一层全部拷贝,
拷贝后指向两个内存,所以不会一起改变

clear()清空
s = {"a1","a2"}
s.clear()
print(s)

删除集合元素
pop()  随机删除
v = {"11", "22", "33", "44", "55"}
v.pop()
print(v)

remove()   在集合中删除指定值 没有时报错
v = {"11", "22", "33", "44", "55"}
v.remove("22")
print(v)

v = {"11", "22", "33", "44", "55"}
v.remove("77")
print(v)

discard() 在集合中删除指定值 没有时不报错
v = {"11", "22", "33", "44", "55"}
v.discard("22")
print(v)

v = {"11", "22", "33", "44", "55"}
v.discard("77")
print(v)

update()   更新  不用接收
v = {"11", "22", "33", "44", "55"}
n = {"aaa","sss"}
v.update(n)
print(v)


差集(后面的元素一般是可迭代对象)
v.difference(n)   v中存在n中不存在的数据,并取出
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
a = v.difference(n)
print(a)

v.difference_update(n)     找到v中存在n中不存在的数据,并更新v中的值,
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
v.difference_update(n)
print(v)

对称差集
v.symmetric_difference(n)  去掉v,n中相同的元素,并取出
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
a = v.symmetric_difference(n)
print(a)

v.symmetric_difference_update(n)   去掉v,n中相同的元素,并更新v中的值
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
v.symmetric_difference_update(n)
print(v)

交集
intersection()     找到v,n中相同的元素,并取出
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
a = v.intersection(n)
print(a)

intersection_update()      找到v,n中相同的元素,并更新v中的值
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
v.intersection_update(n)
print(v)

isdisjoint()  判断是否无交集 有交集False,没有True
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
a = v.isdisjoint(n)
print(a)

union()    #并集
v = {"11","22","33","44","55"}
n = {"44","55","66","77","88"}
a = v.union(n)
print(a)

v.issubset(n)  判断v是否是n的子集
v = {"44","55"}
n = {"44","55","66","77","88"}
a = v.issubset(n)
print(a)

v.issuperset(n)    判断v是否是n的父集
v = {"44","55","66","77","88"}
n = {"44","55"}
a = v.issuperset(n)
print(a)

去重  相当于变成集合类型的数
li = ["44","55","66","77","88","44","44"]
v = set(li)
print(v)
集合

 

文件操作  操作文件三要素:(#打开文件后,一定要关闭)
1 路径 :E:\\python\老师讲解笔记和程序\day6\s7day6.txt
2 编码 :utf-8
3 模式 :只读 只写 读写 r rb w wb a ab r+ w+ r+b w+b a+b r+能读能写(最常用,最强大)w+写读(先清空再写)w+比a+功能更强大
1 只读 读取utf-8编码数据,转换成Unicode编码的数据 文件在硬盘上时,一定是某种编码,utf-8或gbk等等
a---mode = "r" 模式 转换
open(文件路径,encoding= "utf-8",mode=“r”)
b---mode ="rb" 不做转换 读取的时候 rb模式的表现形式 bytes
open(文件路径,mode=“rb”) 不常用

********#绝对路径E:\\python\老师讲解笔记和程序\day6\s7day6.txt
**********#相对路径 直接写文件名
# a-- 读取在硬盘里的utf-8编码数据,读到内存后转换成Unicode编码的数据,在内存里的表现形式为字符串
obj = open("D:\\abc.txt",encoding="utf-8",mode="r")
content = obj.read()     #字符串类型
obj.close()
print(content)
# b-- 不设置编码转换的时候,表现形式为bytes类型
obj = open("D:\\abc.txt",mode="rb")
content = obj.read()     #bytes类型
obj.close()
print(content)

obj = open("user.txt",encoding="utf-8",mode="r")
content = obj.read()     #字符串类型
obj.close()
print(content)

 

 2 只写  不存在时创建,存在时先清空然后覆盖内容
#a---- open(文件路径,encoding= "utf-8",mode="w")
obj = open("美女.txt",encoding="utf-8",mode="w")
obj.write("海角-嘉敏")
obj.close()

#b----  open(文件路径,mode=“wb”) 不常用
obj = open("美女.txt",mode="wb")
obj.write("海角-嘉敏00000".encode("utf-8"))
obj.close()

#写完之后不能读
obj = open("美女.txt",mode="w")
content = obj.read()
obj.close()
print(content)

 

 3  只追加  a  ******a+只能在最后写******
obj = open("美女.txt",encoding="utf-8",mode="a")
obj.write("小红")
obj.close()

obj = open("美女.txt",mode="ab")
obj.write("000".encode("utf-8"))
obj.close()

#r+  读写  默认在最后写
obj = open("美女.txt",encoding="utf-8",mode="r+")
data = obj.read()#
obj.write("gggg")#写,单独写的时候,会从头开始写,有内容的话会覆盖
obj.close()
print(data)

obj = open("美女.txt",encoding="utf-8",mode="r+")
obj.write('666')#写,单独写的时候,会从头开始写,有内容的话会覆盖
obj.close()

obj = open("美女.txt",encoding="utf-8",mode="r+")
data = obj.read(4)
obj.write('666')  #依旧写到最后位置
obj.close()
print(data)

obj = open("美女.txt",encoding="utf-8",mode="r+")
data = obj.read(2)
obj.seek(1)     #seek是字节,汉字三个字节一位,标明了要写入的位置
obj.write("0")    #单独写的时候,会从头开始写,有内容的话会覆盖
obj.close()       #指定写的时候,有内容的话会覆盖,(只是看不到,)
print(data)

 

1 语法:
2     file object = open(file_name [, access_mode][, buffering])
3 各个参数的细节如下:
4 
5     file_name:file_name变量是一个包含了你要访问的文件名称的字符串值。
6     access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。
7     buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。

 

文件操作功能:
#read(读到第几个字符(r)\字节(rb))   默认读取所有文件
obj = open("美女.txt",encoding="utf-8",mode="r+")
data = obj.read(2)
print(data)

obj = open("美女.txt",mode="r+b")
data = obj.read(2)
print(data)

#write("字节(wb)或字符串(w)")#不存在时创建,存在时先清空然后覆盖内容
obj = open("美女.txt",encoding="utf-8",mode="w+")
obj.write("2")
obj.close()

#seek(n)  指定位置写并覆盖 指定指针位置  不管是r还是rb  n永远都是字节
obj = open("美女.txt",encoding="utf-8",mode="r+")
obj.seek(1)     #seek是字节,汉字三个字节一位,标明了要写入的位置
data = obj.read(2)
obj.close()
print(data)

#**tell()  读取当前指针在哪
obj = open("美女.txt",encoding="utf-8",mode="r+")
# obj.tell()
# obj.close()
num = int(input("请输入要读取的字符:"))#因为编码不同,当文件里是汉字时,写入数字和字母会出现错误,因为字母,数字和汉字所占的位数不同导致的
data = obj.read(num)
obj.seek(obj.tell())
obj.write("34")

flush()     #将内存中的内容强制刷到硬盘
obj = open("aaa",encoding="utf-8",mode="w")
while True:
    data = input(">>>")
    obj.write(data)     #因为无法执行close,所以写的只能写到内存中
    obj.flush() #强刷会把内容强制刷到硬盘里,就能读到东西了
obj.close()

obj = open("aaa",encoding="utf-8",mode="r"+)
val = obj.read()
print(val)

readline()      #只读一行
obj = open("美女.txt",encoding="utf-8",mode="r+")
data = obj.readline()
print(data)     #读一次之后,指针在第2个位置,再次去读就会从下一个位置开始读
data = obj.readline()
print(data)

readlines()      #按行读到所有东西
xreadlines()   #py3里没有这个功能了

#重点:
#for line in obj : #把每一行都打印出来        等价于py2里的 #xreadlines()
obj = open("美女.txt",encoding="utf-8",mode="r+")
for line in obj:
    print(line)
obj.close()

#手动关毕
#打开文件后,一定要关闭

obj = open(文件路径,mode=rb)
xxxx
obj.close()

#自动关闭
with open(文件路径,mode= "rb") as obj:
     xxx  #代码执行完毕后,自动关闭文件

truncate()       #截取文件内容,根据指针位置,只保留之前的数据
obj = open("美女.txt",encoding="utf-8",mode="r+")
obj.seek(3)
obj.truncate()
obj.close()

writeable()     #是否可写
#以r 模式打开的时候不可写

readable()     #是否可读
#以w 模式打开的时候不可读

fileno()   #文件描述符,就是一个数字
文件操作功能

 








posted @ 2017-08-27 08:11  chitalu  阅读(190)  评论(0)    收藏  举报