Python零基础先修课第五周

Python零基础先修课第五周

笔记

组合类型

  1. 文件
    -存储在外部介质上的数据或信息集合
    -有序的数据序列
    文本显示
    -计算机显示功能的基本问题
    编码
    -信息从一种形式或格式转换为另一种形式的过程
  2. 常用的编码
    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'
  1. 文件数据
    -文本文件:以ASCII码方式存储的文件。优点:方便阅读理解
    Python使用常规换行符(\n)
    -二进制文件:广义即指文件,文件在外部设备的存放形式为二进制。狭义即指除了文本文件的其他文件,如照片、音乐、视频、计算机程序等。优点:更加节省空间、采用二进制无格式存储,速度更快、表示更为精确,不会造成有效位的丢失。
    Note:文本文件是基于字符定长的ASCII码。二进制文件编码是变长的,灵活利用率高。不同的二进制文件编码方式不同。
  2. 文件的基本处理
    打开文件
    -建立磁盘上的文件与程序中的对象相关联。
    -通过相关的文件对象获得。
    -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()
  1. 字典的基础
    字典
    -针对非序列集合而提供的一种数据类型
    -举例:检索学生或员工信息
    “<键><值>对”
    键(身份证号码),值(学生信息)
    什么是字典
    -通过任意键值查找集合中值信息的过程叫映射
    -python中通过字典实现映射
    -字典是一个键值对的集合:该集合以键为索引,同一个键信息对应一个值
  2. 字典类型与序列类型的区别
    -存取和访问的方式不同。
    -键类型不同:序列的键只能是数字,而字典的键可以是数字、字符串、元组等。
    -排列方式不同:序列类型保持了元素间的相对关系,而字典中的数据是无序排列的。保持顺序需序列。
    -映射值的方式不同:序列类型通过地址映射到值,而字典类型中的键直接映射到值。
  3. 字典的操作
    为字典增加一项
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 文件名进行安装。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值