Python零基础先修课第五周
作者:互联网
Python零基础先修课第五周
笔记
组合类型
- 文件
-存储在外部介质上的数据或信息集合
-有序的数据序列
文本显示
-计算机显示功能的基本问题
编码
-信息从一种形式或格式转换为另一种形式的过程 - 常用的编码
ASCII码是标准化字符集
-7个二进制位编码
-表示128个字符
Unicode
-跨语言、跨平台
-统一且唯一的二进制编码
-每个字符两个字节长
-65536个字符的编码空间
-“严”:其Unicode十六进制数为4E25
UTF-8编码
-可变长度的Unicode(英文对应Unicode的单字节,中文、日文、韩文对应三字节)
-“严”:对应UTF-8十六进制数为E4B8A5
Python中字符串类型未编码
-编码encode()
-解码decode()
>>> s="中文字符串"
>>> bs=s.encode("utf-8")
>>> bs
b'\xe4\xb8\xad\xe6\x96\x87\xe5\xad\x97\xe7\xac\xa6\xe4\xb8\xb2'
即“中”对应xe4\xb8\xad\
>>> bs.decode("utf-8")
'中文字符串'
GBK编码
-《汉字内码拓展规范》
-双字符编码
>>> s=“中文字符串”
>>> gs=s.encode("gbk")
>>> gs
b'\xd6\xd0\xce\xc4\xd7\xd6\xb7\xfb\xb4\xae'
- 文件数据
-文本文件:以ASCII码方式存储的文件。优点:方便阅读理解
Python使用常规换行符(\n)
-二进制文件:广义即指文件,文件在外部设备的存放形式为二进制。狭义即指除了文本文件的其他文件,如照片、音乐、视频、计算机程序等。优点:更加节省空间、采用二进制无格式存储,速度更快、表示更为精确,不会造成有效位的丢失。
Note:文本文件是基于字符定长的ASCII码。二进制文件编码是变长的,灵活利用率高。不同的二进制文件编码方式不同。 - 文件的基本处理
打开文件
-建立磁盘上的文件与程序中的对象相关联。
-通过相关的文件对象获得。
-open()
<variable>=open(<name>,<mode>)
<name>
磁盘文件名
<mode>
打开模式
打开一个名为”numbers.dat”的文本文件
>>> infile=open("numbers.dat","r")
>>> infile=open("music.mp3","rb")
文件操作:读取、写入、定位、其他:追加、计算等。
关闭文件
-切断文件与程序的联系
-写入磁盘,并释放文件缓冲区
#读操作
def main():
fname=input("Enter filename:")
infile=open(fname,"r")
data=infile.read()
print(data)
main()
infile=open(someFile,"r")
for i in range(5):
line=infile.readline()
print(line[:-1])
>>> outfile=open("outfile.txt","w")
>>> outfile.writelines(["Hello"," ","world"])
>>> outfile.close()
>>> infile=open("outfile.txt","r")
>>> infile.read()
'Hello world'
文件遍历
-最常见的文件处理方法
-举例:拷贝文件、根据数据文件定义行走路径、将文件由一种编码转换到另外一种编码。
通用文件遍历代码框架:
file=open(someFile,"r") #只需将someFile替换为所需要的文件名
for line in file.readlines():
#处理一行文件内容
file.close()
#简化代码框架
file=open(someFile,"r")
for line in file:
#处理一行文件内容
file.close()
实例:文件拷贝
def main():
#用户输入文件名
f1=input("Enter a souce file:").strip()
f2=input("Enter a souce file:").strip()
#打开文件
infile=open(f1,"r")
outfile=open(f2,"w")
global countLines
#拷贝数据
countLines=0
countChars=0
for line in infile:
countLines += 1
countChars += len(line)
outfile.write(line)
print(countLines,"line and",countChars,"chars copied")
infile.close()
outfile.close()
main()
实例:
#根据数据文件在窗口中动态路径绘制
import turtle
def main():
#设置窗口信息
turtle.title("数据驱动的动态路径绘制")
turtle.setup(800,600,0,0)
#设置画笔
pen=turtle.Turtle()
pen.color("red")
pen.width(5)
pen.shape("turtle")
pen.speed(5)
#读取文件
result=[]
file=open("data.txt","r")
for line in file:
result.append(list(map(float,line.split(","))))
print(result)
#动态绘制
for i in range(len(result)):
pen.color(result[i][3],result[i][4],result[i][5])
pen.fd(result[i][0])
if result[i][1]:
pen.rt(result[i][2])
else:
pen.lt(result[i][2])
pen.goto(0,0)
if __name__=="__main__":
main()
实例:多文件读写
输入:电话簿、邮箱地址簿文件
处理:将两个文件内容进行合并
输出:合并后包含电话和邮箱地址簿的文件
程序步骤:
-第一步:打开文件、读取文件
-第二步:分别获取文件中的信息到2个列表1和列表2
-第三步:建立合并用的空列表3.完成列表1和2的信息合并操作到列表3中。
-第四步:将列表3中的信息写入到新文件
-第五步:关闭所有打开的文件
完整代码如下:
def main():
#打开文件、读取文件
ftele1=open("TeleAddressBook.txt","rb")
ftele2=open("EmailAddressBook.txt","rb")
ftele1.readline()#跳过第一行
ftele2.readline()
lines1=ftele1.readlines()
lines2=ftele2.readlines()
#建立空列表用于存储姓名、电话、E-mail
list1_name=[]
list1_tele=[]
list2_name=[]
list2_email=[]
#获取TeleAddressBook中的信息
for line in lines1:#获取第一个文本中的姓名和电话信息
elements=line.split()
list1_name.append(str(elements[0].decode("gbk")))
list1_tele.append(str(elements[1].decode("gbk")))
#获取EmailAddressBook中的信息
for line in lines2:#获取第一个文本中的姓名和电话信息
elements=line.split()
list2_name.append(str(elements[0].decode("gbk")))
list2_email.append(str(elements[1].decode("gbk")))
#生成新的数据
lines=[]
lines.append("姓名\t电话\t\t邮箱\n")
#按索引方式遍历姓名列表1
for i in range(len(list1_name)):
s=''
if list1_name[i] in list2_name:
j=list2_name.index(list1_name[i])#找到姓名列表1对应列表2中的姓名的序号
s='\t'.join([list1_name[i],list1_tele[i],list2_email[j]])
s+='\n'
else:
s='\t'.join([list1_name[i],list1_tele[i],str(' ----- ')])
s+='\n'
lines.append(s)
#处理姓名列表2中剩余的姓名
for j in range(len(list2_name)):
s=''
if list2_name[j] not in list1_name:
s='\t'.join([list2_name[j],str(' ----- '),list2_email[j]])
s+='\n'
lines.append(s)
#将新生成的合并数据写入新的文件中
ftele3=open("AddressBook.txt","w")
ftele3.writelines(lines)
#关闭文件
ftele3.close()
ftele1.close()
ftele2.close()
print("The addressbooks are merged!")
main()
- 字典的基础
字典
-针对非序列集合而提供的一种数据类型
-举例:检索学生或员工信息
“<键><值>对”
键(身份证号码),值(学生信息)
什么是字典
-通过任意键值查找集合中值信息的过程叫映射
-python中通过字典实现映射
-字典是一个键值对的集合:该集合以键为索引,同一个键信息对应一个值 - 字典类型与序列类型的区别
-存取和访问的方式不同。
-键类型不同:序列的键只能是数字,而字典的键可以是数字、字符串、元组等。
-排列方式不同:序列类型保持了元素间的相对关系,而字典中的数据是无序排列的。保持顺序需序列。
-映射值的方式不同:序列类型通过地址映射到值,而字典类型中的键直接映射到值。 - 字典的操作
为字典增加一项
dictionaryName[key]=value
>>> students={"203-2012-045":"John","203-2012-037":"Peter"}
>>> print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter'}
>>> students["202-2011-121"]="Susan"
>>> print(students)
{'203-2012-045': 'John', '203-2012-037': 'Peter', '202-2011-121': 'Susan'}
删除字典中的一项
del dictionaryName[key]
字典的遍历
for key in dictionaryName:
print(key + ":" + str(dictionaryName[key]))
>>> students={"203-2012-045":"John","203-2012-037":"Peter"}
>>> for key in students:
print(key + ":" + str(students[key]))
203-2012-045:John
203-2012-037:Peter
多种需求:
-遍历字典的键key
for key in dictionaryName.keys():print(key)
-遍历字典的值value
for value in dictionaryName.values():print(value)
-遍历字典的项
for item in dictionaryName.items():print(item)
-遍历字典的键值对(key-value)
for item , value in adict.items():print(item,value)
判断一个键是否在字典中
-in
或者 not in
>>> "203-2012-045" in students
True
>>> "203-2022-045" in students
False
字典的标准操作符
-,<,>,<=,>=,==,!=,and,or,not
字典不支持拼接操作和重复操作符,字典无序
实例:
统计词频问题
-统计文章重复词语
-概要分析文章内容
-搜索引擎
IPO模式:
输入:从文件中读取一篇英文文章
处理:统计文件中每个单词的出现频率
输出:将最常出现的10个单词及出现次数,以图表形式输出
-第一步:输入英文文章
-第二步:建立用于词频计算的空字典
-第三步:对文本的每一行计算词频
-第四步:从字典中获取数据对到列表中
-第五步:对列表中的数据对交换位置,并从大到小进行排序
-第六步:输出结果
-第七步:用turtle库绘制统计词频结果图表
import turtle
#全局标量
#词频排列显示个数
count=10
#单词频率数组—作为y轴数据
data=[]
#单词数组—作为x轴数据
words=[]
#y轴显示放大倍数—可以根据词频数量进行调节
yScale=0.1
#x轴显示放大倍数—可以根据词频数量进行调整
xScale=30
#从点(x1,y1)到(x2,y2)绘制线段
def drawLine(t,x1,y1,x2,y2):
t.penup()
t.goto(x1,y1)
t.pendown()
t.goto(x2,y2)
t.speed(2)
#在坐标(x,y)处写文字
def drawText(t,x,y,text):
t.penup()
t.goto(x,y)
t.pendown()
t.write(text)
def drawGraph(t):
#绘制x/y轴线
drawLine(t,0,0,360,0)
drawLine(t,0,300,0,0)
#x轴:坐标及描述
for x in range(count):
x=x+1 #向右移一位,为了不画在原点上
drawText(t,x*xScale-4,-20,(words[x-1]))
drawText(t,x*xScale-4,data[x-1]*yScale+10,data[x-1])
drawBar(t)
#绘制一个柱体
def drawRectangle(t,x,y):
x=x*xScale
y=y*yScale#放大倍数显示
drawLine(t,x-5,0,x-5,y)
drawLine(t,x-5,y,x+5,y)
drawLine(t,x+5,y,x+5,0)
drawLine(t,x+5,0,x-5,0)
#绘制多个柱体
def drawBar(t):
for i in range(count):
drawRectangle(t,i+1,data[i])
#实现计算一行文本的词频
def processLine(line,wordCounts):
#用空格替换标点符号
line=replacePunctuations(line)
#从每一行获取每个词
words=line.split()
for word in words:
if word in wordCounts:
wordCounts[word]+=1
else:
wordCounts[word]=1
#空格替换标点的函数
def replacePunctuations(line):
for ch in line:
if ch in "~@#$%^&*()_-+=<>?/,.:;{}[]|\'""":
line=line.replace(ch,"")
return line
def main():
#用户输入一个文件名
filename=input("enter a filename:").strip()#去掉首尾空格
infile=open(filename,"r")
#建立用于计算词频的空字典
wordCounts={}
for line in infile:
processLine(line.lower(),wordCounts)
#从字典中获取数据对
pairs=list(wordCounts.items())
#列表中的数据对交换位置,数据对排序
items=[[x,y] for (y,x) in pairs]
items.sort()
#输出count个数词频结果
for i in range(len(items)-1,len(items)-count-1,-1):
print(items[i][1]+'\t'+str(items[i][0]))
data.append(items[i][0])
words.append(items[i][1])
infile.close()
#根据词频结果绘制柱状图
turtle.title("词频结果柱状图")
turtle.setup(900,750,0,0)
t=turtle.Turtle()
t.hideturtle()
t.width(3)
drawGraph(t)
main()
实例:用字典类型实现数据合并
def main():
#利用字典将2个通讯录文本合并为一个文本,gbk是用来将中文写入文本,防止乱码
ftele1=open("TeleAddressBook.txt","rb")
ftele2=open("EmailAddressBook.txt","rb")
ftele1.readline()#跳过第一行
ftele2.readline()
lines1=ftele1.readlines()
lines2=ftele2.readlines()
dic1={}#字典方式保存
dic2={}
for line in lines1:#获取第一个文本中的姓名和电话信息
elements=line.split()
#将文本读出来的bytes转换为str类型
dic1[elements[0]]=str(elements[1].decode("gbk"))
for line in lines2:#获取第二个文本中的姓名和邮箱信息
elements=line.split()
dic2[elements[0]]=str(elements[1].decode("gbk"))
#生成新的数据
lines=[]
lines.append("姓名\t电话\t\t邮箱\n")
for key in dic1:
s=''
if key in dic2.keys():
s='\t'.join([str(key.decode("gbk")),dic1[key],dic2[key]])
s+='\n'
else:
s='\t'.join([str(key.decode("gbk")),dic1[key],str(" ----- ")])
s+='\n'
lines.append(s)
for key in dic2:
s=''
if key not in dic1.keys():
s='\t'.join([str(key.decode("gbk")),str(' ----- '),dic2[key]])
s+='\n'
lines.append(s)
#将新生成的合并数据写入新的文件中
ftele3=open("AddressBook.txt","w")
ftele3.writelines(lines)
#关闭文件
ftele3.close()
ftele1.close()
ftele2.close()
print("The addressbooks are merged!")
main()
作业
#作业第一题
#r
def main():
fname=input("Enter filename:")
infile=open(fname,"r",encoding='utf-8')
data=infile.read()
print(data)
main()
输出:
Enter filename:test.txt
中国是个伟大的国家!
#rb
def main():
fname=input("Enter filename:")
infile=open(fname,"rb")
data=infile.read()
print(data)
main()
输出:
Enter filename:test.txt
b'\xe4\xb8\xad\xe5\x9b\xbd\xe6\x98\xaf\xe4\xb8\xaa\xe4\xbc\x9f\xe5\xa4\xa7\xe7\x9a\x84\xe5\x9b\xbd\xe5\xae\xb6\xef\xbc\x81'
#作业第二题
fo=open('魔法少女竹千代.txt','r',encoding='utf-8')
for line in fo:
linew=fo.readline()
print(linew[:-1])
fo.close()
输出:
吾乃魔法少女竹千代!
这里是,魔法少女广场!
让我们开启结界,战斗开始!
看我的火焰魔法!
>>>
3哈姆雷特词频统计
#作业第三题
#法一
def getText():
txt=open("hamlet.txt","r").read()
txt=txt.lower()
for ch in '!"#$%()*+,-./:;<=>?@[\\]^_`{|}~':
txt=txt.replace(ch," ")#将文本中特殊字符替换为空格
return txt
hamletTxt=getText()
words=hamletTxt.split()
counts={}
for word in words:
counts[word]=counts.get(word,0)+1
items=list(counts.items())
items.sort(key=lambda x:x[1],reverse=True)
for i in range(10):
word,count=items[i]
print("{0:<10}{1:>5}".format(word,count))
输出:
the 1138
and 965
to 754
of 669
you 550
i 542
a 542
my 514
hamlet 462
in 436
#法二
#全局标量
#词频排列显示个数
count=10
#实现计算一行文本的词频
def processLine(line,wordCounts):
#用空格替换标点符号
line=replacePunctuations(line)
#从每一行获取每个词
words=line.split()
for word in words:
if word in wordCounts:
wordCounts[word]+=1
else:
wordCounts[word]=1
#空格替换标点的函数
def replacePunctuations(line):
for ch in line:
if ch in "~@#$%^&*()_-+=<>?/,.:;{}[]|\'""":
line=line.replace(ch,"")
return line
def main():
#用户输入一个文件名
filename=input("enter a filename:").strip()#去掉首尾空格
infile=open(filename,"r")
#建立用于计算词频的空字典
wordCounts={}
for line in infile:
processLine(line.lower(),wordCounts)
#从字典中获取数据对
pairs=list(wordCounts.items())
#列表中的数据对交换位置,数据对排序
items=[[x,y] for (y,x) in pairs]
items.sort()
#输出count个数词频结果
for i in range(len(items)-1,len(items)-count-1,-1):
print(items[i][1]+'\t'+str(items[i][0]))
infile.close()
main()
4中文分词安装jieba库
我听过最善意的谎言就是pip install
但是在这里jieba库貌似可以用这个方式安装,如果不行,可以到这个网站下载:
https://pypi.org/project/jieba/#files
如果还有其他库装不上,可以尝试这个网站:
https://www.lfd.uci.edu/~gohlke/pythonlibs/
找到电脑对应的文件,下载到python所在的scripts文件夹中,在进入命令行进入该文件所在文件夹,用pip install 文件名进行安装。
标签:文件,key,Python,items,第五,修课,line,open,字典 来源: https://blog.csdn.net/qq_43541776/article/details/112154826