字典
字典是Python唯一的映射类型,由键(Key)和值(Value)相互对应。
映射和序列的区别
映射类型区别于序列类型,序列类型是以数组的形式进行存储,通过索引的方式来取得相应位置的值,一般索引值和对应存储的数据毫无关系。
- 索引实例
- 字典实例
字典又多个键及对应的值共同构成,每一对键值组合称之为项。
再建立一个字典
- 建立一个空字典
- 查看帮助文档
- 利用元组创建字典和利用key加value创建列表
- 给字典的键赋值
若键存在于字典中,则改写键对的值;若不存在,不会报错,而会直接创建一个新的键,并未它赋值。
dict()并不是一个普通的函数,而是一个工厂函数(类型)
字典的内置方法
-
fromkeys()
-
访问字典的几个方法
(1)keys()
返回字典键的引用
(2)values()
(3)items()
-
get()
在字典里索引不存在的项会报错,但是这样看起来有些粗暴,这时就要送到get方法
在不知道一个键是否在字典中时,可以使用成员资格运算符(in 、not in)来进行判断
在字典中检查键的成员资格,要比序列高效,当数据规模很大时,两者差距明显;在这里我们查找的是元素的键,而在序列里我们查找的是元素的值。 -
clear()清空字典
-
copy()
-
pop()
-
popitem()
随机弹出一项,因为在字典里项没有顺序
-
setdefault()
类似于get方法,但是setdefault在字典中找不到对应键时会自动添加。
也可以添加键值对
添加位置随机 -
update()
利用一个字典或映射关系去更新另外一个字典。
集合
‘{}’并不是字典的特权,'set’是集合的类型
集合在Python中的作用是‘唯一’
集合中所有重复的元素都被自动剔除了,集合中所有的元素都是唯一的,具有唯一性。
注意:集合是无序的,所以不能索引集合中的某一个元素。
创建集合
- 用‘{}’将元素括起来
- 使用set()工厂函数
- 去掉重复元素
(1)不使用集合
(2)使用集合
注意:集合的顺序是随机的,所以如果原本列表有顺序,那么通过集合消除重复元素所得到的列表顺序一般会发生改变。
访问集合中的值
- 使用for将集合中的数据依次读取
- 通过 in 和 not in 判断元素是否存在集合中
不可变集合
- frozenset()
建立一个不可变集合,集合内元素不可更新
文件
打开文件
参数部分
(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
file:文件名
mode:文件的打开模式
打开模式 | 执行操作 |
---|---|
‘r’ | 以只读方式打开文件(默认) |
‘w’ | 以写入的方式打开文件,会覆盖已存在的文件 |
‘x’ | 如果文件已经存在,使用此模式打开将引发异常 |
‘a’ | 以写入模式打开,如果文件存在,则在末尾追加写入 |
‘b’ | 以二进制模式打开文件 |
‘t’ | 以文本模式打开(默认) |
‘+’ | 可读写模式(可添加到其他模式中使用) |
‘U’ | 通用换行符支持 |
打开路径 G:\pythonNote\ 下的文件 openfile.txt
在这里使用双反斜杠是为了防止python误判反斜杠为转义字符,导致报错;虽然在python3.7中单个反斜杠的使用也会被自动识别为双反斜杠存储
但是尽量还是使用双反斜杠,或者使用斜杠
- 文件对象方法
文件对象方法 | 执行操作 |
---|---|
f.close | 关闭文件 |
f.read(size=-1) | 从文件读取size个字符,当未给定size或给定负值的时候,读取剩余的所有字符,然后作为字符串返回 |
f.readline() | 以写入模式打开,如果文件存在,则在末尾追加写入 |
f.write(str) | 将字符串str写入文件 |
f.writelines(seq) | 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象 |
f.seek(offset, from) | 在文件中移动文件指针,从from(0代表文件起始位置,1代表当前位置,2代表文件末尾)偏移offset个字节 |
f.tell() | 返回当前在文件中的位置 |
注意:要养成写入完文件要f.close()的习惯(尤其是对于c语言来说),虽然python和java有不同于c语言的垃圾回收机制,不会造成内存泄露,但是写入后如果没有立即保存,此时若断电,那么写入的数据也会丢失。
- 读取文件
不对f.read()的参数进行设置的话,这个方法会把文档中所有字符读取出来,文件指针指到末尾。
- 文件的写入
当你想要对文件进行写入时,一定要保证在之前打开文件时,选择的打开模式是‘w’或‘a’,否则会报错。
以‘w’模式打开一个不存在的文件,即在该路径下新建了一个文件。
这时就可以看到该路径的这个文档了
- 文件分割保存
编写一个程序,将该对话分割成三段并将a、b两人的对话分开。
def save_file(a, b, count):
filename_a = 'a_' + str(count) + '.txt'
filename_b = 'b_' + str(count) + '.txt'
a_file = open(filename_a, 'w')
b_file = open(filename_b, 'w')
b_file.writelines(a)
a_file.writelines(b)
# f.writelines(seq) 向文件写入字符串序列seq,seq应该是一个返回字符串的可迭代对象
a_file.close()
b_file.close()
def split_file(file_name):
f = open(file_name)
a = []
b = []
count = 1
for each_line in f:
if each_line[:6] != '******':
(role, line_spoken) = each_line.split(':', 1)
# split(sep=None, maxsplit=-1) 不带参数默认以空格为分隔符切片字符串,maxsplit表示分隔多少个子字符串,分会切片后的子字符串的列表
if role == 'a':
a.append(line_spoken)
if role == 'b':
b.append(line_spoken)
else:
save_file(a, b, count)
a = []
b = []
count += 1
f.close()
split_file('record.txt')
# 若出现错误'ValueError: not enough values to unpack (expected 2, got 1)'的话,只需要删除多余的空行
切割对话,生成六个文件
模块
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块的函数等功能。
OS:Operating System
我们常用的操作系统有 Windows、Mac OS、Linux、UNIX等,这些操作体统底层对于文件系统的访问工作原理是不一样的,因此需要针对不同的系统来考虑使用哪些文件系统模块,这样意味着当程序的运行环境一改变,就需要相应的去修改大量的代码。
但是Python是跨平台的语言,使用OS模块就不用关心什么操作系统下使用什么模块,OS模块会自动选择正确的模块来调用。
os模块中关于文件/目录常用的函数使用方法
-
getcwd()
返回当前工作目录
-
chdir(path)
改变工作目录
-
listdir(path=’.’)
列举指定目录中的文件名(’.‘表示当前目录,’..'表示上一级目录)
-
mkdir(path)
创建单层目录,如该目录已存在抛出异常
当中间有一级目录不存在时,就会抛出异常 -
makedirs(path)
递归创建多层目录,如该目录已存在抛出异常,注意:‘E:\a\b’和’E:\a\c’并不会冲突,和mkdir()不同的是,若中间目录不存在,则会新建中间文件,不会抛出异常。 -
remove()
删除文件 -
rmdir(path)
删除单层目录
-
removedirs(path)
递归删除目录,从子目录到父目录逐层尝试删除,遇到目录非空则抛出异常 -
rename(old, new)
将old重命名为new -
system(command)
运行系统的shell命令
以下是支持路径操作中常用到的一些定义,支持所有平台 -
os.curdir
指代当前目录(’.’)
-
os.pardir
指代上一级目录(’…’) -
os.sep
输出操作系统特定的路径分隔符(Win下为‘\’,Linux下为’/’) -
os.linesep
当前平台使用的行终止符(Win下为‘\r\n’,Linux下为’\n’) -
os.name
指代当前使用的操作系统(包括:‘posix’,‘nt’,‘mac’,‘os2’,‘ce’,‘java’)
os.path模块中关于路径常用的函数使用方法
-
basename(path)
去掉目录路径,单独返回文件名 -
dirname(path)
去掉文件名,单独返回目录路径
-
join(path1[,path2[,…]])
将path1,path2,…各部分组合成一个路径名 -
split(path)
分割文件名与路径,返回(f_path, f_name)元组。如果完全使用目录,它也会将最后一个目录作为文件名分离,且不会判断或者目标是否存在。 -
splitext(path)
分离文件名与扩展名,返回(f_name, f_extension)元组 -
getsize(file)
返回指定文件的尺寸,单位是字节 -
getatime(file)
返回指定文件最近的访问时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) -
getctime(file)
返回指定文件的创建时间(浮点型秒数,可用time模块的gmtime()或localtime()函数换算) -
getmtime(file)
返回指定文件的最新的修改时间(浮点型秒数,可用time模块gmtime()或localtime()函数换算)
以下为函数返回True或False
-
exists(path)
判断指定路径(目录或文件)是否存在 -
isabs(path)
判断指定路径是否为绝对路径 -
isdir(path)
判断指定路径是否存在且是一个目录 -
isfile(path)
判断指定路径是否存在且是一个文件 -
islink(path)
判断指定路径是否存在且是一个符号链接 -
ismount(path)
判断指定路径是否存在且是一个挂载点
‘C:\’、‘D:\’…就是一个挂载点,而’C:\A\'不是一个挂载点 -
samefile(path1, path2)
判断path1和path2两个路径是否指向同一个文件
pickle模块
几乎可以把python的对象都转化为二进制的形式存放字节流。
存放称为:pickling
读取称为:unpickling
‘wb’是以二进制形式写入
‘rb’是以二进制形式读取
pickle可以用于在字典数据量庞大的情况下,数据的读取和重复使用这样数据的源代码也会更加的简洁易读。
异常
Python标准异常总结
https://fishc.com.cn/thread-45814-1-1.html
异常的检测和处理
- try-except语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
当访问一个不存在的文件时,使其按照定义的内容报错。
类型异常
当程序中的异常没有定义时,按照原样输出
如果想所有异常可以被定义输出,不爆出系统异常
但是不建议这样处理,因为这样会隐藏程序员所有未准备好的异常的错误,当用户输入‘ctrl+c’中断操作时,也会被捕捉为异常,导致中断失败。
同时对多个异常进行统一的处理
- try-finally语句
try:
检测范围
except Exception[as reason]:
出现异常(Exception)后的处理代码
finally:
无论如何都会被执行的代码
这里的5表示写入了5个字符,然而当打开这个文件的时候发现文件仍然是空的。
原因是新建文件并写入后,执行到‘sum = 1 + ‘1’ ’时报错,直接跳转到except后执行,并没有执行close()语句保存,所以才会显示写入了5个字符,而文件中并未存储。
那么如果有一定要执行的语句,就要用到finally
写入成功。
- raise语句
自己引发出一个异常
else&with
else
- 求最大约数
def showMaxFactor(num):
count = num // 2
while count > 1:
if num % count == 0:
print('%d最大是约数是%d' % (num, count))
break
count -= 1
else:
print('%d是素数!' % num)
num = int(input('请输入一个数:'))
showMaxFactor(num)
- else和异常
try:
int('abc') #当括号内是'abc'时跳转except执行,当括号内是'123'时跳转else执行
except ValueError as reason:
print('出错啦:' + str(reason))
else:
print('没有任何异常!')
with语句
with语句自动帮你关闭文件
原格式
这里由于data.txt 文件并不存在,所以会报错,由于是以‘w’方式打开,所以会新建一个文件;如果data.txt文件是以‘r’方式打开,那么在报错后,执行finally语句的时候,就相当于关闭一个不存在的文件。
with格式