2019.07.19(day06)学习笔记

目录

一.复习回顾

1.函数

2.集合

3.序列类型

  • 字符串/元组/列表(因为他们都有索引)

4.字典

二.文件和数据格式化

1.文本处理

(1)文件的理解

  • 文件是存储在辅助器上的数据序列
  • 文件时数据存储的一种形式
  • 文件有两种展现形态:文本文件和二进制文件
    • 本质上,所有文件都二进制形式存储
    • 形式上,所有文件采用两种方式展示
  • 文本文件

    • 文件是数据的抽象和集合
      • 由单一特定编码组成的文件,如UTF-8
      • 由于存在编码,也被看成是存储着的长字符串
      • 适用于列如:.txt文、.py文件等
  • 二进制文件

    • 文件是数据的抽象和集合
      • 直接有比特0和1组成,没有统一的字符编码
      • 一般存在二进制0和1的组织结构,即文件格式
      • 适用于列如:.png文件、.avi文件等
  • 文本文件,二进制文件的区别

    • 文本形式:

      中国是个伟大的国家!
    • 二进制形式:

      b'\xd6\xd0\xb9\xfa\xca\xc7\xb8\xf6\xce\xb0\xb4\xf3\xb5\xc4\xb9\xfa\xbc\xd2\xa3\xa1'

(2)文件的打开和关闭

  • 文件处理的步骤:打开-操作-关闭

    a=open(,)# 打开
    
    a.read(size)# 读文件
    a.readline(size)
    a.readlines(hint)
    
    a.write(s)# 写文件
    a.writelines(lines)
    a.seek(offset)
  • 文件的打开

    f = open(r'E:\python folder\day06\t1.txt','r')
    # open是打开这个文件路径,r是read只可读
    data = f.read()# f.read是读取这个文件
    print(data)
    f.close()
    
    # 覆盖写入,清空文件后写入
    f = open(r'E:\python folder\day06\t1.txt','w')
    data=f.write('name:xichen,age:18')
    print(data)
    f.close()
    
    f = open(r'E:\python folder\day06\t1.txt','r')
    data=f.read()
    print(data)
    f.close()
  • 文件的打开模式

    文件的打开模式 描述
    'r' 只读模式,默认值,如果文件不存在,返回FileNotFoundError
    'w' 覆盖写模式,文件不存在则创建,存在则完全覆盖
    'x' 创建写模式,文件不存在则创建,存在则返回FileExistsError
    'a' 追加写模式,文件不存在则创建,存在则在文件最后追加内容
    'b' 二进制文件模式
    't' 文本文件模式,默认值
    '+' 与r/w/x/a一同使用,在原功能基础上增加同时读写功能
    • 文本形式、只读模式、默认值:f = open("f.txt")
    • 文本形式、只读模式、同默认值:f = open("f.txt", "rt")
    • 文本形式、覆盖写模式:f = open("f.txt", "w")
    • 文本形式、追加写模式+ 读文件:f = open("f.txt", "a+")
    • 文本形式、创建写模式:f = open("f.txt", "x")
    • 二进制形式、只读模式:f = open("f.txt", "b")
    • 二进制形式、覆盖写模式:f = open("f.txt"):f = open("f.txt", "wb")
  • 文件的关闭

    <变量名>.close() # 变量名为文件句柄

(3)文件的使用

  • 文本形式打开

    # 文本形式打开文件
    tf = open("f.txt", "rt")
    print(tf.readline()) 
    tf.close()
  • 二进制形式打开

    # 二进制形式打开文件
    bf = open("f.txt", "rb")
    print(bf.readline()) 
    bf.close()

(4)文件的内容读取

操作方法 描述
.read(size=-1) 读入全部内容,如果给出参数,读入前size长度,s = f.read(2) # 中国
.readline(size=-1) 读入一行内容,如果给出参数,读入该行前size长度,s = f.readline() # 中国是一个伟大的国家!
.readlines(hint=-1) 读入文件所有行,以每行为元素形成列表如果给出参数,读入前hint行,s = f.readlines() # ['中国是一个伟大的国家!']

2.词频统计

(1)英文词频统计

# 词频:单词出现的次数

f = open(r'E:\python folder\day06\t1.txt','r',encoding='utf8')# open 打开路径的文件,r是读取模式,表示只可读
data = f.read().lower()# 把读取到的内容赋给data的时候同时转成小写
# print(data)# 得到的数据是str型
# print(type(data))# type 是用来测试返回值的类型的/这里指的是data的类型
data_split = data.split(' ')# 用切割的方法将读取到的数据 根据空格来切割
# print(data_split) # 打印出切割过后的data_split,切割过后的返回值是一个列表

count_dict = {} # 定义一个空的字典count_dict
for word in data_split:# 循环输出data_split这个列表
    if word not in count_dict:# 判断每一次循环data_split的word是否在这个count_dict空的集合里
        count_dict[word] = 1 # 如果不在(not in)那这个ount_dict空的集合就+上这个单词word
    else:
        count_dict[word] += 1# 如果这个word已经在这个count_dict集合里,那这个单词的数量就+1

print(count_dict)
def func(i):# 直接可以拿来用的func函数
    return i[1]# 把lt这个列表里的元素取出来放在func里面的,然后进行排序

lt = list(count_dict.items())# 将count_dict这个集合的键值对(key,value)取出来以后用list强制转换成列表类型赋给列表lt
lt.sort(key=func)# 调用func这个函数,对lt列表key的内容进行排序,是升序的

lt.reverse()# 在将lt列表转为逆序排序

for i in lt[0:10]:
    print(f'{i[0]:^7}{i[1]^5}')

# dic = {}
# dic['the'] = 0
# dic['hamlet'] = 10
# print(dic)

(2)中文词频统计

# 统计中文(三国演义的书)
import jieba

f = open(r'E:\python folder\day06\threekingdoms.txt', 'r', encoding='utf8')
# open打开文件所在的路径,把文件赋给f,r代表只读模式,encoding='utf8'代表读取文件的编码格式
data = f.read()# read读取这个f文件,把读出来的值赋给data

# print(data)

data_jieba = jieba.lcut(data) # 调用jieba库把data文件给分词,然后赋给一个新的变量data_jieba
print(type(data_jieba))

count_dict = {}# 定义一个空的集合count_dict
for word in data_jieba: # 循环jieba库分词出来的数据,也就是放在data_jieba列表里面的数据,
    if len(word) == 1:# 判断循环出来的词的长度是否等于1
        continue# 如果等于1,就结束本次循环

    if word in {"将军", "却说", "荆州", "二人", "不可", "不能", "如此", "商议"}:
        continue# 判断循环出来的词是否在{"将军", "却说", "荆州", "二人", "不可", "不能", "如此", "商议"}这个集合里
        # 如果在这个集合里,那就结束本次循环

    if '曰' in word:# 判断’曰‘这个词是否在循环的这个词里
        word = word.replace('曰', '')# 如果在的话,那就用空的字符替换曰

    if word in count_dict:# 如果循环的这个词已将在我们定义的count_dict这个集合里面了
        count_dict[word] += 1# 那count_dict[word]的值就累加1,用来计数
    else:
        count_dict[word] = 1# 如果不在,那就在集合里面添加这个词,并且赋给他值1


def func(i):# 调用func这个函数
    return i[1]


data_list = list(count_dict.items()) # 将我们得到count_dict集合里面的的键值对取出来,将他转换为list列表赋给data_list

data_list.sort(key=func)# 将data_list列表里的key的值(value)调用上面的func的函数,让他的value的值按升序排序
data_list.reverse()#在将他逆序

print(data_list)

3.词云

# pip install matplotlib
# pip install wordcloud

# pip install scipy
# pip install pillow
# pip install imageio

import wordcloud
from imageio import imread

mask = imread(r"E:\python folder\day06\test7.png")

f = open(r'E:\python folder\day06\threekingdoms.txt', 'r', encoding='utf8')
data = f.read()

w = wordcloud.WordCloud(font_path=r'C:\Windows\Fonts\simkai.ttf', mask=mask, width=1000, height=700,
                        background_color="white")
w.generate(data)
w.to_file('outfile.png')

3.作业

1.定义一个函数,该函数可以实现在内部输入一个信息,如何该信息不能转换为正整数,则重新输入,直到能转换为正整数,则对外返回转换的正整数

def get_int():
    while True:
        data =input('请输入一个数:')
        if data.isdigit():# 判断输入的数是不是数字
            return int(data)
res = get_int()
print(res)

2.定义一个函数,该函数可以实现在内部输入一个信息,如何该信息不能转换为负整数,则重新输入,直到能转换为负整数,则对外返回转换的负整数

def get_int():
    while True:
        data = input('data: ')
        if data.isdigit():
            return int(-1*data)
        elif data.startswith('-') and data[1:].isdigit() and data.count('-') == 1:
            num = data.split('-')[1]
            if num.isdigit():
                return int(data)
            else:
                num = data.split('.')
                num = str(num[0])
                return num
        else:
            num = data.split('.')
            num=str(num[0])
            return int(num)*-1
res = get_int()
print(res)

3.定义一个函数,实现外界传入一个信息,内部判断是否能被转换为正整数,返回True | Flase信息

def get_int():
    data=input('data:')
    if data.startswith('-') and data[1:].isdigit() and data.count('-') == 1:
        return True
    if data.isdigit():
        return True
    else:
        return False
res = get_int()
print(res)

4.定义一个函数,实现外界传入一个信息,内部判断是否能被转换为负整数,返回True | Flase信息

def get_int():
    data = input('data:')
    if data.startswith('-') and data[1:].isdigit() and data.count('-') == 1:
        return True
    if data.isdigit():
        return True
    if '.'in data:
        return True
    else:
        return False
res = get_int()
print(res)

5.定义一个函数,实现传入一个整型数字,判断并直接打印该数字是否是奇数还是偶数

def get_int(data):
    if data%2 ==0:
        print('data是个','偶数')
    else:
        print('data是个', '奇数')
get_int(101)

6.写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

def get_list(data):
    res=[]
    ls=['xichen','beautiful','xuchen','height','weight']
    if data > 2:
        print(ls[:2])
        return ls[2:]
    else:
        print(ls)
res=get_list(3)
res=get_list(2)

7.写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者。

def get_list(data):
    ls = [ ]
    for i in range(len(data)):
        if i % 2 == 1:
            ls.append(data[i])
    print(ls)
data = ['xu','chen','cheng','yu','cheng','xing']
res = get_list(data)

8.定义一个函数,只要传入 "k1:v1,...,kn:vn" 这样固定格式的字符串,都可以将其转换为 {'k1':'v1',...,'kn':'vn'}这样的字典并返回

def get_dict(data):
    dic1 = dict()
    ls = t.split(',')
    for i in ls:
        ls2=i.split(':')
        dic1[ls2[0]]=ls2[1]
    print(dic1)
t="k1:v1,k2:v2,k3:v3,k4:v4,kn:vn"
get_dict(t)

9.简单购物车,要求如下 (可以用函数也可以不用):# 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入,购买成功后打印添加到购物车里的信息.

def get_yes():
    while True:
        ls=[]
        msg_dic={'apple':10,'tesla':100000,'mac':3000,'lenovo':30000,'chicken':10,}
        for i in msg_dic.items():
            tu=i
            print('name:',tu[0],'price:',tu[1])
        for i in msg_dic.items():
            name = input('商品>>:')
            num = input('购买个数>>:')
            if name in msg_dic and num.isdigit():
                ls.append((name, msg_dic[name], num))
                print(ls)
            else:
                continue
res=get_yes()
print(res)
上一篇:作业day06


下一篇:DAY06 JAVA基础语法1注释2标识符