Python-字典、集合、字符编码、文件操作整理-Day3
1、字典
1.1、为什么有字典:
有个需求,存所有人的信息 这时候列表就不能轻易的表示完全
names = ['stone','liang']
1.2、元组:
定义符号()
t = (1,2,3)
tuple 是元组的意思
列表与元组不一样的地方是它 元组不可以修改
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法
names = ("alex","jack","eric")
它只有2个方法,一个是count,一个是index,完毕。
1.3、列表:
list = [1,2,3,4]
用列表去查复杂的信息和取数据就很麻烦
利用字典:存储更复杂的数据
1.4、定义字典:
定义:{key1:value1,key2:value2},key-value结构,key必须可hash
特性:
- 可存放多个值
- 可修改指定key对应的值,可变
无序
dic = {'key':'value','age':'18'}
字典的元素是由key:value 组成的
dic= {} --> dict() --> init()
1.5、小技巧:
按ctrl 直接到对应函数的操作成员列表内
>>> dic4 = dict(name='stone',age = 18)
>>> print(dic4)
{'age': 18, 'name': 'stone'}
>>> dic5 = dict({'name':'stone','age':18})
>>> print dic5
File "<stdin>", line 1
print dic5
^
SyntaxError: Missing parentheses in call to 'print'
>>> print(dic5)
{'age': 18, 'name': 'stone'}
2、字典的基本操作:
2.1、查询
dic['key']
dic['name']
直接在字典里面找KEY 取到value
列表的查询:
print(dic["namee"])
没有的话会直接报错
但是字典get不会报错
print(dic.get('naness'))
输出none
2.2、增加
字典中添加是无序的添加
dic['gender']='female'
列表是有序的
2.3、改
dic['name'] = 'stone'
改的是value
2.4、删除
del 万能的
del dic['name']
字典里面怎么定义的key 调用的时候就是那么写
2.5、复制:copy 浅copy
dic1 = dic.copy()
print(dic1)
2.6、深入 copy
import copy
dic3 = copy.deepcopy(dic)
copy.copy是浅copy
2.7、快速生成字典fromkeys
dic= {'name':'stone','age':18}
data = dic.fromkeys([1,2,3])
print(date)
输出:
{1: None, 2: None, 3: None}
生成的字典跟声明的字典dic没有关系
2.8、items
print(dic.items())
for i in dic.items():
print(i)
2.9、key value形式
keys将字典中所有的key取出
将所有的keys以列表的形式显示出来
for i in dic.keys():
print('keys is %s,value is %s' %(i,dic[i]))
以列表和元组的形式显示出来
2.10、删除pop()
dic.pop(keys)
注意是只能是填写keys
pop(keys)必须存在才能删除
2.11、随机删除popitem()
随机删除key value
这个函数不需要函数随机删除
2.12、setdefault
dic.setdefault('gender',[]).append('mail') #dic['gender']=[]
或者是
dic['gender'].appemd('female')
2.13、更新update
方法一:
dic1={'gender':'male','name':'lhf'}
dic.update(dic1)
print(dic)
方法二:
可以根据key进行更新
dic.update(name='stone',gender='male')
print(dic)
2.14、values取所有的值
for i in dic.values(dic1)
print(i)
3、字典key的定义规则:
3.1、可变的原理:
通过id()进行内存调用查看是否是一个内存空间
字符串和数字是不可变的
列表:是可变的类型 是指列表里面包含的元素可变
3.2、key的定义规则
- 必须是不可变的,不可变的类型:数字,字符串,元组
通过内置方法hash 判断一个数据类型是否可变
hash('sdfas')
-41789881
hash['s'] #hash 列表
Traceback (most recent call last):
File "字典当中的key是唯一的:不能是重复的
判断一个字典里有没有这个值
菜单思路:
首先一个死循环
数据类型的小结分类说明
4、集合
4.1、定义
由不同元素组成的集合,集合中是一组无序排列的可hash值,可以作为字典的key
4.1.1、集合的创建
{1,2,3,1}
或
定义可变集合set
>>> set_test=set('hello')
>>> set_test
{'l', 'o', 'e', 'h'}
改为不可变集合frozenset
>>> f_set_test=frozenset(set_test)
>>> f_set_test
frozenset({'l', 'e', 'h', 'o'})
4.2、特性
- 集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
元素唯一:
例子:
s1= {'a',1,2,'b','c','c'}
print(s1)
不会有相同的元素
4.3、集合的关系运算
in
not in
==
!=
<,<=
>,>=
|,|=:合集
&.&=:交集
-,-=:差集
^,^=:对称差分
4.3.1、交集
查看不同集合中共有的元素:s1&s2(集合的内置方法)== intersection()
4.3.2、并集
s1|s2 == union()
4.3.3、差集
s1-s2 ==
4.3.4、对称差集
把多个集合的交集去除s1^s2
4.3.5、子集
s2 <= s1 s2是s1的子集
4.3.6、父集
s2 => s1 s1是s2的子集
4.4、集合其他的内置方法
4.4.1、update
s1.update('2')
s1.update((1,2,3,4))
s2 = {'h','2','1'}
s1.update(s2)
s1.update('hello')
4.4.2、增加
s1.add('hello')
print(s1)
4.4.3、随机删除pop()
4.4.4、指定删除
remove()
s1.remove('a')
s1.remove('w')
print(s1)
以上用remove()没有元素会报错:
不报错删除:
s1:discard('w')
用以上的会默认输出none 不会抛出异常
4.4.5、拷贝:
copy 跟字典是一样的
difference_update s1 =s1 -s2
4.5、集合工厂函数
s = set([3,5,9,10]) #创建一个数值集合
t = set("Hello") #创建一个唯一字符的集合
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集
c = t – s # 求差集(项在t中,但不在s中)
d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
基本操作:
t.add('x') # 添加一项
s.update([10,37,42]) # 在s中添加多项
使用remove()可以删除一项:
t.remove('H')
len(s)
set 的长度
x in s
测试 x 是否是 s 的成员
x not in s
测试 x 是否不是 s 的成员
s.issubset(t)
s <= t
测试是否 s 中的每一个元素都在 t 中
s.issuperset(t)
s >= t
测试是否 t 中的每一个元素都在 s 中
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 和 t 中不重复的元素
s.copy()
返回 set “s”的一个浅复制
class set(object):
"""
set() -> new empty set object
set(iterable) -> new set object
Build an unordered collection of unique elements.
"""
def add(self, *args, **kwargs): # real signature unknown
"""
Add an element to a set.
This has no effect if the element is already present.
"""
pass
def clear(self, *args, **kwargs): # real signature unknown
""" Remove all elements from this set. """
pass
def copy(self, *args, **kwargs): # real signature unknown
""" Return a shallow copy of a set. """
pass
def difference(self, *args, **kwargs): # real signature unknown
"""
相当于s1-s2
Return the difference of two or more sets as a new set.
(i.e. all elements that are in this set but not the others.)
"""
pass
def difference_update(self, *args, **kwargs): # real signature unknown
""" Remove all elements of another set from this set. """
pass
def discard(self, *args, **kwargs): # real signature unknown
"""
与remove功能相同,删除元素不存在时不会抛出异常
Remove an element from a set if it is a member.
If the element is not a member, do nothing.
"""
pass
def intersection(self, *args, **kwargs): # real signature unknown
"""
相当于s1&s2
Return the intersection of two sets as a new set.
(i.e. all elements that are in both sets.)
"""
pass
def intersection_update(self, *args, **kwargs): # real signature unknown
""" Update a set with the intersection of itself and another. """
pass
def isdisjoint(self, *args, **kwargs): # real signature unknown
""" Return True if two sets have a null intersection. """
pass
def issubset(self, *args, **kwargs): # real signature unknown
"""
相当于s1<=s2
Report whether another set contains this set. """
pass
def issuperset(self, *args, **kwargs): # real signature unknown
"""
相当于s1>=s2
Report whether this set contains another set. """
pass
def pop(self, *args, **kwargs): # real signature unknown
"""
Remove and return an arbitrary set element.
Raises KeyError if the set is empty.
"""
pass
def remove(self, *args, **kwargs): # real signature unknown
"""
Remove an element from a set; it must be a member.
If the element is not a member, raise a KeyError.
"""
pass
def symmetric_difference(self, *args, **kwargs): # real signature unknown
"""
相当于s1^s2
Return the symmetric difference of two sets as a new set.
(i.e. all elements that are in exactly one of the sets.)
"""
pass
def symmetric_difference_update(self, *args, **kwargs): # real signature unknown
""" Update a set with the symmetric difference of itself and another. """
pass
def union(self, *args, **kwargs): # real signature unknown
"""
相当于s1|s2
Return the union of sets as a new set.
(i.e. all elements that are in either set.)
"""
pass
def update(self, *args, **kwargs): # real signature unknown
""" Update a set with the union of itself and others. """
pass
5、字符编码
5.1、 什么是字符编码
计算机要想工作必须通电,也就是说‘电’驱使计算机干活,而‘电’的特性,就是高低电压(高低压即二进制数1,低电压即二进制数0),也就是说计算机只认识数字
编程的目的是让计算机干活,而编程的结果说白了只是一堆字符,也就是说我们编程最终要实现的是:一堆字符驱动计算机干活
所以必须经过一个过程:
字符串--------(翻译过程)------->数字
这个过程实际就是一个字符如何对应一个特定数字的标准,这个标准称之为字符编码
1. 内存固定使用unicode,硬盘的编码(可以修改的软件编码)
2. 使用什么编码存储,就用什么编码读取
3. 程序运行分两个阶段,1.从硬盘读到内存 2. python 解释器运行已经读到内存的代码
4. 针对一个文件来说,python 与nodpad++ 区别是多了第二个步骤
5. coding 指定字符编码 是在告诉解释器 使用什么字符编码读取文件
6、文件处理
6.1、文件处理流程
1. 打开文件,得到文件句柄并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
6.2、文件操作基本流程
f = open('a.txt') #打开文件
first_line = f.readline() #读取文件第一行
print('first line:',first_line) #打印第一行
print('华丽分隔线'.center(50,'-'))
data = f.read() # 读取剩下的所有内容,文件大时不要用
print(data) #打印读取内容
f.close() #关闭文件
6.3、详细操作
data = open("test").read()
read() 将文件内容全部读取出来
打开文件的时候应该先定义变量:
f = open(test)
print(f.readline())
strip() 会把整行的开头末尾的空格和换行去除
f.readline()一行一行读,从上一行
f.readlines() 会将文件内容输出 以列表展示
6.4、实现循环读取文件部分内容:
方法一:不要用readlines()
for index,line in enumerate(f.readlines()):
if index <5:
print(line.strip())
else:
break
#####enumerate 只能用于列表
方法二:
for i in range(5):
print(f.readline().strip())
方法三:
for line in f:
print(line.strip())
一行行处理
line_nu = 0
for line in f:
if line_nu < 5:
print(line.strip())
line_nu +=1
else:
break
6.5 文件操作模式
文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】
w,只写模式【不可读;不存在则创建;存在则清空内容】
x, 只写模式【不可读;不存在则创建,存在则报错】
a, 追加模式【可读; 不存在则创建;存在则只追加内容】
"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
x+ ,写读【可读,可写】
a+, 写读【可读,可写】
"b"表示以字节的方式操作
rb 或 r+b
wb 或 w+b
xb 或 w+b
ab 或 a+b
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
6.6 文件操作示例
6.6.1 写 "w"
f = open("myfile","w")
f.write("我爱北京天安门\n")
f.write("我爱烫头\n")
f.close()
以上输入会以一行的形式显示。换行添加“\n”
注意:w模式会将原文件内容清空并写入新数据!!!
w:创建文件并清空该文件内容
###没有声明模式:默认模式是读模式 r
6.6.2、a:追加
f = open("myfile",'a')
f.write("我爱\n")
f.close
追加文件内容结尾
6.6.3、混合模式:可读可写
读写:r+
写读:w+
追加读:a+
insert的内容会 追加到最后面
6.6.4、closed判断文件是否关闭
print(f.closed)
6.6.5、打印文件的字符集编码
print(f.encoding)
6.6.6、操作系统打开文件的索引
print(f.fileno())
6.6.7、强制将内存内容刷到磁盘
f.flush()
实时的刷新内存内容到磁盘
flush原理:
文件操作是通过软件将文件从硬盘读到内存写入文件的操作也都是存入内存缓冲区buffer
(内存速度快于硬盘,如果写入文件的数据都从内存刷到硬盘,
内存与硬盘的速度延迟会被无限放大,效率变低,
所以要刷到硬盘的数据我们统一往内存的一小 块空间即buffer中放,
一段时间后操作系统会将buffer中数据一次 性刷到硬盘)
flush即,强制将写入的数据刷到硬盘
滚动条:
import sys,time
for i in range(10):
sys.stdout.write('#')
sys.stdout.flush()
time.sleep(0.2)
6.6.8、判断是否是终端文件,不可读
f.isatty()
6.6.9、打印文件名
f.name :打印文件名
6.6.10、按字符寻找
f.seek()#寻找
f.seek(10)
print(f.readline())
找到什么位置(以字符为n)
6.6.11、告诉当前光标位置
print(f.tell())
print(f.readline())
6.6.12、f.truncate()从光标位置截断并移除后面的所有内容
f.truncate() #截断
注意需要打开文件执行
对于文本的截断没有什么卵用
对于二进制文件进行截断 断点续传
6.6.13、f.writelines()
data = ["stone\n","liang"]
将列表里面的值 追加到内容前
6.7、执行脚本传入参数
Python有大量的模块,从而使得开发Python程序非常简洁。类库有包括三中:
Python内部提供的模块
业内开源的模块
程序员自己开发的模块
Python内部提供一个 sys 的模块,其中的 sys.argv 用来捕获执行执行python脚本时传入的参数
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print sys.argv
Python-字典、集合、字符编码、文件操作整理-Day3的更多相关文章
- python字符编码-文件操作
字符编码 字符编码历史及发展 为什么有字符编码 ''' 原因:人们想要将数据存入计算机 计算机的能存储的信息都是二进制的数据 内存是基于电工作的,而电信号只有高低频两种,就用01来表示高低电频,所以计 ...
- Python自动化开发 - 字符编码、文件和集合
本节内容 字符编码 文件操作 集合 一.字符编码 1.编码 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.解决思路:数字与符号建立一对一映射,用不同数字表示不同符号. ASCI ...
- python基础_字符编码
字符编码的历史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII 阶段二:为了满足中文,中国人定制了GBK 阶段三:各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的 ...
- (Python )格式化输出、文件操作、json
本节学习Python的格式化输出,文件操作以及json的简单用法 1.格式化输出 将非字符串类型转换成字符串,可以使用函数:str() 或者repr() ,(这两个函数的区别目前我还没搞懂,求解答) ...
- Python基础之字符编码,文件操作流与函数
一.字符编码 1.字符编码的发展史 阶段一:现代计算机起源于美国,最早诞生也是基于英文考虑的ASCII ASCII:一个Bytes代表一个字符(英文字符/键盘上的所有其他字符),1Bytes=8bit ...
- Python编程Day7——字符编码、字符与字节、文件操作
一.字符编码 重点 ***** 1. 什么是字符编码:将人识别的字符转换计算机能识别的01,转换的规则就是字符编码表2. 常用的编码表:ascii.unicode.GBK.Shift_JIS.Euc- ...
- Python全栈开发之路 【第三篇】:Python基础之字符编码和文件操作
本节内容 一.三元运算 三元运算又称三目运算,是对简单的条件语句的简写,如: 简单条件语句: if 条件成立: val = 1 else: val = 2 改成三元运算: val = 1 if 条件成 ...
- python基础之元组、文件操作、编码、函数、变量
1.集合set 集合是无序的,不重复的,主要作用: 去重,把一个列表变成集合,就可以自动去重 关系测试,测试两组数据的交集,差集,并集等关系 操作例子如下: list_1 = [1,4,5,7,3,6 ...
- python基础(四)文件操作和集合
一.文件操作 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句柄操作文件 3.关闭文件. 1.文件基本操作: f = open('file.txt','r') # ...
随机推荐
- 深入理解JVM垃圾收集机制(JDK1.8)
垃圾收集算法 标记-清除算法 最基础的收集算法是"标记-清除"(Mark-Sweep)算法,分两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象. 不足: ...
- Java Swing应用程序JLable超链接
在HTML中设置一个超链接是很容易的,使用<a></a>标签就可以完成了. 在客户端应用程序中,并没有这样的标签,但是可以使用按钮来实现,But 有时候就是想好看一点,不想要按 ...
- jQuery中的ajax的相关方法
JQuery对Ajax操作进行了封装,$.ajax()方法属于最底层的方法,第2层是load().$.get().$.post()方法,第3层是$.getScript()和$.getJSON()方法. ...
- 详解小白利用eclipse+CDT+MinGW搭建C++开发环境
安装JDK.安装Eclipse 2.打开Eclipse 找到“help”下的“Eclipse marketplace” 如图: 3.选择相应的C插件: 因为安装过所以显示installe ...
- 用golang 实现一个代理池
背景 写爬虫的时候总会遇到爬取速度过快而被封IP的情况,这个时候就需要使用代理了.在https://github.com/henson/ProxyPool 的启发下,决定自己实现一个代理池.项目已经开 ...
- new Date的兼容性问题
标准浏览器下正常,结果ie.老版本的IOS微信公众号不支持,搞不懂,原来有兼容性问题 //beginData格式为'yyyy-mm-dd' 1 var _date = new Date(Date.pa ...
- poj-1056-IMMEDIATE DECODABILITY(字典)
Description An encoding of a set of symbols is said to be immediately decodable if no code for one s ...
- mysql-proxy实现读写分离
其中Amoeba for MySQL也是实现读写分离 环境描述:操作系统:CentOS6.5 32位主服务器Master:192.168.179.146从服务器Slave:192.168.179.14 ...
- KVM之七:KVM克隆
1.在克隆虚拟机之前,必须先暂停或者停掉kvm 虚拟机.以虚拟机 snale 为例,先暂停虚拟机,如下 [root@kvm ~ ::]#virsh list Id 名称 状态 ------------ ...
- clumsy模拟客户端网络差的场景的使用
1.为什么需要模拟客户端网络差的情况? a. 研发环境的网络配置一般较高,网络响应快,不容易出现网络故障,但是客户使用的网络环境千差万别,不排除使用过程中遇到网络故障的情况. b.程序有些时候是多线程 ...