6.类
项目案例:实现快递机器人
任务:实现帮助用户寄件和取件
项目任务:模拟填单和取件时获取单号的功能
项目实现代码:
class Robot():#创建一个名为Robot的类 def __init__(self):#定义了__init__()初始化方法,在初始化方法中自动保存了机器人Robot的初始化信息。 print('我是您的快递小助手') self.bill=20230100 self.postage={'北京':15,'上海':12,'广东':13} def send_ex(self):#定义了send_ex()方法,用于提示用户需要填入的信息 print('请填写您的寄件信息') self.addr=input('您的寄件地址') self.number=input('您的手机号码') self.name=input('您的姓名:') print('您需要支付',self.postage[ self.addr[0:2] ]元) self.bill +=1 print('账单生成中...\n您的寄件单号:',self.bill) def collect_ex(self):#定义了collect_ex()取件方法,用于模拟用户取件。 self.c_list=int(input('请输入您的取件号:')) if self.c_list in self.q_number: print('您的快递已找到,请扫码领取。') self.q_number.pop() else: print('未找到您的快递') a=Robot() a.send_ex()7.操作文件
7.1文件
7.1.1文件的介绍
文件3部分组成:文件保存的路径,文件类型和文件的内容
7.1.2文件的编码方式
美国设计了ASCII,ASCII 码使用 7 位二进制数进行编码,共可以表示 128 (2⁷) 个不同的字符。这些字符分为两大类:
1.控制字符(0-31 和 127):共 33 个,这些字符不用于显示,而是用于控制文本处理或设备操作。
例如:LF (换行)、CR (回车)、TAB (制表符)、DEL (删除)、BEL (响铃) 等。
2.可显示字符(32-126):共 95 个,这些是我们在屏幕上能看到的字符。
数字:0-9 (ASCII 48-57)
大写字母:A-Z (ASCII 65-90)
小写字母:a-z (ASCII 97-122) 标点符号和运算符:如空格 (32)
业界协会统一创建了Unicode(统一码,例如 UTF-8 编码),UTF-8编码完全兼容ASCII。
7.1.3编码与Unicode值的转换
chr()函数的使用
功能:chr(i),返回i对应的Unicode字符
参数i:二进制,十进制,十六进制,在转化时都会转换为二进制的数值
示例代码:
print(chr(35),chr(ox23),chr(0b00100011)在Python中十六进制数值默认使用0x开头, 二进制数值使用0b开头,十进制数值与通常写法相同。
执行结果:# # #(#的ASCII的值为代码中的00100011,Uricode编码统一了所有编码方式中字符的数值,使得相同的字符具有相同的二进制数值,因此这里的00100011通过Unicode转换后的一个字符为一个#,而十进制的35和十六进制的0x23都可以转换位00100011)
ord()函数:ord(c)
功能:返回c的Unicode数值
参数c:数据类型为字符串类型且表示单个字符
示例代码:
print(ord('a'))代码执行结果:
97
代码中将字符'a'转换为Unicode数值。但由于print()函数会默认输出十进制的数值,因此代码执行结果不会显示为二进制数值。
示例代码(将汉字转化为Unicode编码,将数字转化为Unicode字符)
print(ord('中')) print(chr(20010))第1行代码将"中"转换为Unicode数值,第2行代码将数字20010转换为Unicode字符。
代码执行结果:
20013
个
7.1.4编码转换
encode()方法
字符串.encode(encoding='utf-8',errors='strict')
功能:将字符串转化为二进制编码
s='我正在学习Python语言' a=s.encode('gbk') print(a) #代码执行结果:b'\xce\xd2\xd5\xfd\xd4\xda\xd1\xa7\xcf\xb0Python\xd3\xef\xd1\xd4'参数encoding:字符串的编码方式,默认为UTF-8编码方式,表示将字符串以UTF-8编码方式转换为二进制码值。例如,如果想使用简体中文,可以将编码方式设置为GB2312。
参数errors: 当字符串中存在不能以指定编码方式进行转换的字符(例如字符串中包含拉丁语,不能转换GB2312编码方式的字符)时会引发错误,而errors可用于设置处理错误的方式,值可以为'strict、ignore、replace和xmlcharrefreplace’。'strict表示遇到非法字符就提示异常,ignore表示忽略非法字符,'replace'表示用问号(?)替代非法字符,'xmlcharrefreplace'表示使用XML(Extensible Markup Language,可扩展标记语言)的字符引用。
第2行代码使用字符串中的encode()方法将字符串'我正在学习Python语言'以GBK编码方式转化为二进制值,并赋值给变量a。
代码执行结果:
b'\xce\xd2\xd5\xfd\xd4\xda\xd1\xa7\xcf\xb0Python\xd3\xef\xd1\xd4‘
decode()方法
decode(encoding='utf-8’,errors='strict')
功能:将二进制值按照指定的编码方式转换为字符串,与encode()方法相反
参数encoding:需要使用的编码方式,默认为UTF-8编码方式,表示将二进制数值转换为UTF-8编码方式的字符串。
参数errors:当二进制数值中存在无法转换为对应编码方式的字符的二进制值时会引发错误,而errors可用于设置处理错误的方式,值可以为'strict、ignore'、replace'。'strict'表示遇到非法二进制值就提示异常,ignore'表示忽略非法二进制值,'replace'表示用问号替代非法二进制值。
示例代码:
s='我正在学习Python语言' a=s.encode('gbk') b=a.decode('gbk') print(b)第2行代码将s字符串的内容按照GBK编码方式转化为二进制数值,并将其赋值给变量a。第3行代码将变量a的内容(即二进制数值)按照GBK编码方式转换为字符串。
代码执行结果:
我正在学习python语言
utf-8存在中文
gbk纯中文
7.2操作文件
7.2.1打开文件
open(file,mode='r',buffering=-1,encoding=None,errors=None,newline=None,closefd=True,opener=None)
功能:打开一个文件。这里的打开文件在操作系统中打开文件的概念不同,这里的打开文件是与文件建立通道并获取操作文件的权限。
参数file:需要打开的文件路径,数据类型为字符串类型
参数Mode:指明文件打开的模式,文件常见的几种打开模式如表7-1所示。
| 模式 | 描述 |
| ‘r’ | 只读模式。如果计算机中此文件不存在则会出现异常错误;如果此文件存在则只允许对文件进行读取操作 |
| ‘w’ | 覆盖写模式。只允该对文件进行写入操作,如果计算机中此文件已存在则先清除此文件中的内容再写入;如果此文件不存在则创建一个新文件再写入 |
| 'x' | 创建写模式。如果计算机中不存在文件则创建一个新文件,如果存在此文件则返回异常错误 FileExistsError(文件存在错误) |
| 'a' | 追加写模式,只允许对文件进行写入操作,如果计算机中存在此文件则在该文件的末尾继续写入(不删除文件原来的内容)如果不存在此文件,则创建一个新的文件再写入。 |
| 'b' | 二进制模式。当文件是二进制文件时,需要使用'b'模式 |
| 't' | 文本模式。与'b'模式相互对应,'t模式为默认模式 |
| '+' | 增加模式。与'r','w','x','a'模式一同使用,可在原功能基础上增加读写功能,例如'r+'表示文件可读可写 |
| 'U' | 通用换行模式(已弃用) |
参数buffering:设置缓冲区大小,即设置内存一次读取文件内容的大小,对读取能无要求时此项参数保持默认即可。如果需要设置,该参数是一个可选的整数。值为0表示关闭缓冲(只在二制模式下可用),值为1表示选择行缓冲(只在文本模式下可用)。如果值大于1,表示设置固定大小的块缓冲区
默认值-1表示选择默认大小的缓冲区,通常操作系统默认缓冲区大小为4096或8192字节。
参数encoding:表示需要打开文件的编码方式,在文本模式下有效。默认编码方式与平台相关,通常为cp936'编码方式,是GBK编码方式的一种。
参数errors:指定如何处理编码错误
参数newline:控制通用换行符的工作方式
参数closefd:如果该参数值为False,当关闭文件时,底层文件描述符操作系统内部利用文件描述符来访问文件,相当于操作系统和文件的通道将保持打开状态,即不关闭文件对象。如果该参数值为Ture,当给定一个文件名时,参数closefd将不起作用。
参数opener:(不理解可跳过)自定义启动器。
实现对文件的操作需要执行3个步骤,分别是打开文件、操作文件和关闭文件。
打开文件,操作文件,关闭文件,使用形式如下:
file=open()#打开文件 file.方法#操作文件 file.close()#关闭文件使用open()函数打开“E:\书代码\第7章\编程语言概述.txt”文件
f=open('E:\书代码\编程语言概述.txt','r') print(f) f.close()文件路径中的\会和后面的字符形成转义字符,从而引发异常报错
#示例代码: f=open('E:\书代码\第7章\n.txt','r') print(f)第1行代码中的文件路径为“E:\书代码\第7章n.txt”,其中\n在字符串中为转义字符,会使得\n转换为换行符,导致程序在读取文件时找不到文件路径,执行代码后会出现OSError,
避免转换字符的转义有3种方法:
1.将路径中的\使用转义字符\\表示,例如'E:书代码\第7章\n.txt'
2.将路径中的\用/表示,例如'E:/书代码/第7章/n.txt'。
3.在字符串前面加上r表示对字符串不进行转义,例如r'E:\书代码\第7章\n.txt'。
打开模式
open()函数的mode参数具有多个打开模式,常见的打开模式:‘w’覆盖式。‘x’创写模式,‘a’追加模式,‘+’增加模式
'w'覆盖写模式:如果文件夹中没有参数file路径中指定的文件,则会创建名为file的文件,如果文件夹中此文件已存在,则删除此文件夹中的内容,重新写入新的内容。
示例代码:
#批量创建文件: for i in range(1,10): path="E:\\书代码\\数据\\2\\数据'+str(i)+'.txt f=open(path,'w') f.close()'x'创建写模式:会创建一个新文件,并给定新文件写入权限
示例代码:
for i in range(1,101): path = 'E:\\书代码\\数据2\\数据'+str(i)+'.txt' f = open (path,'x') f.close () Traceback (most recent call last): Fi1e"E:\书代码\第7章\第7章第7个程序.py",line 3,in <module> f = open (path,'x') EileExistsError:[Errno 17] File exists;':\\书代码\\数据2\\数据1.txt'由于上一个示例代码已经创建了相同名称的文件,因此执行代码后会出现报错,'x'模式与'w'模式的区器于'x'模式需要确保文件不存在,否则会引发报错。修改后的新代码如下:
for i in range(l,101): path ='E:\\书代码\\数据2\\新数据'+str(i)+'.txt' f = open (path,'x') f.close()'a'追加写模式:会保留原有的文件内容,并在文件的末尾继续追加写入新的内容,如果内容不存在。会创建一个新的文件,新文件具备写入权限
示例代码(在a.txt文件中追加内容“提高办公效率”)
f = open(r'E:\书代码\第7章\a.txt','a',encoding='utf-8') f.write('提高办公效率') f.close()'+'增加模式,此模式需要与'r','w','x','a'模式中的一种结合使用,表示在原有模式基础上增加读写权限
示例代码:
f=open(r'E:\书代码\第7章\a.txt','r+',encoding='utf-8') print(f.read()) f.write('。每日学习一个新技能') f.close()模式决定了文件的操作权限,如果越权执行其他操作,将会出现报错
示例代码:
f=open(r'E:\书代码\第7章\a.txt','r',encoding='utf-8') print(f.read()) f.write('。每日学习一个新技能') f.close()这段代码与上段区别在于open()函数中的模式为'r',这限制了之后的代码只能对文件进行读取操作。
open()函数的复合写法
with open(参数) as 变量名:示例代码:
with open(r'E:\书代码\编程语言概述.txt','r',encoding='utf-8') as f: print(f.read())with:Python保留字,上下文管理器,自动管理文件as:也是保留字与with结合,还要注意缩进。
7.2.2读取文件
read()方法,读取文件
文件对象.read(size=-1)功能:从文件中读取内容。
参数size:从文件中读取size个字符的内容,默认读取全部内容。
返回值:读取内容,是字符串类型的。
示例代码(读取文件中的全部内容):
f= open(z'E:\书代码\第7章\编程语言概述,txt’,'r’,encoding ='utf-8') print(f read()) f.close()代码执行结果:
由于计算机不能识别人 <class'str'>
如果open()中第4个参数没有指定,系统会默认编码方式为GBK编码方式,
第1行代码以r模式打开文件,且设置读取文件的编码方式为UTF-8(大小写均可,有中文时需要设置为UTF-8),返回文件对象f。
第2行代码对文件对象f使用read()方法,read()方法中无参数,因此会读取文件中的全部内容。
示例代码(读取文件中的前10个字符):
f= open(z'E:\书代码\第7章\编程语言述,txt','r',encoding='ut£-8') a= f.read(10) print(a,type(a)) f.close()readline()方法,读取一行代码
readline(size = -1)功能:从文件中读取一行内容。参数size:默认从文件中读取一行内容,如果size为其他数值,则读取该行前size个字符返回值:读取内容,是字符串类型的。
f = open(r'E:\书代码\第7章\编程语言概述,txt','r',encoding='utf-8') print(f.readline()) f.close()readline(size):读取第一行的前size个字符
如果往readline()中填入参数6,则表示读取当前行内容中的前6个字符,代码如下!
f= open('E:\书代码\第7章\编程语言概述,txt','r',encoding='utf-8') print(f.readline(6)) f.c1ose()readlines(hint=-1)功能:从文件中读取所有行的内容
7.2.3写入文件
write()写法
write(text)
功能:把字符串text写入文件。
参数text:表示需要写入的信息,其数据类型为字符串类型
返回值:返回写入的字符数(字符串的长度)。
示例代码:
f=open(r'E:\书代码\第七章\编程语言概述.txt','w',encoding='utf-8') print(f.write('我正在学习Python')) f.close()writelines()方法
writelines()方法的使用形式如下!
writlines(lines)功能:把字符事列表(列表中的元素均为字符串)写入文件,且不添加换行符参数lines:字符串列表。
返回值:返回None,表示空。
示例代码(将字符串列表的内容写入文件):
f= open('E:\书代码\第7章\a7.txt','w',encoding='utf-8') 1s=['zhangsan','lisi','wangwu'] print(f.writelines(ls)) f.close()7.3.1调整文件的读取位置
seek(cookie,whence=0)功能:把文件指针(用于指明文件读取的位置)移动到新的位置。
参数cookie:表示相对于whence位置的偏移量,如果为正数表示向右偏移,如果是负数表示向左偏移,一个汉字的偏移量是3.
参数whence:表示文件指针设定的位置,默认值0,表示从文件开头处开始计算,值为1表示从当前位置开始计算,值为2表示从文件结尾处开始。
7.3.2绝对路径和相对路径
绝对路径:表示从根目录开始到文件的路径
相对路径表示相对于当前文件的位置到目标文件的位置
7.4csv文件
csv文件是一种逗号分隔式字符文件
f=open('abcd.csv','r') print(f.read()) f.close()项目案例1读取“中国十二时辰.csv”
fo=open("中国十二时辰.csv","r",encoding='utf=-8') ls=[] for line in fo: line = line.replace("\n","") ls.append(line.split(",")) while True: time_num = input("请输入时间:") try: if(24<int(time_num[0:2]) or int(time_num[0:2])<0 or 60 <int(time_num[3:])or int(time_num[3:])<0): print("输入时间格式错误") continue except: print("输入时间格式错误") continue time_fen=int(time_num[0:2])*60+int(time_num[3:]) for line in ls[1:]: time_first=int(line[1][0:2])*60+int(line[1][3:5]) time_last=int(line[1][6:8])*60+int(line[1][9:]) if time_first<=time_fen<=time_last: print('时辰:',line[0],'\n属相:',line[2],'\n别名和描述:',line[3]) elif (23*60<time_fen<=24*60) or (0<=time_fen<=1*60): print('时辰:',ls[1][0],'\n属相:',ls[1][2],'\n别名和描述:',ls[1][3]) break fo.close()运行结果:
项目案例2:实现整理HTML网页内容
f1 = open('中国城市名称大全.html','r',encoding='utf-8') f2 = open('城市大全.csv','w') a = [] for line in f1: if 'div class="para" label-module="para">' in line: a += line.split('>')[1].split('<')[0].split(' ') for i in a: f2.write(i+',') f1.close() f2.close()8.库
8.1标准库
8.1.1标准库的介绍
标准库:python自带的库