零基础学习python_pickle,一个任务

By admin in 4858.com on 2019年4月21日

目录:

  义务:将文件(record.txt)中的数据实行划分,并设置以下规则保存起来。
  一.小甲鱼的对话单独保存为boy_*.txt的文件(去掉”小甲鱼:”)
  贰.小客服的对话单独保存为girl_*.txt的文件(去掉”小客服:”)
 
三.文本中累计有三段对话,分别保存为boy_1.txt、boy_2.txt、boy_3.txt、gilr_1.txt、gilr_2.txt、gilr_3.txt
      共陆个文本。(提醒:不一样的对话已经运用”====”进行划分)

零基础学习python_pickle,一个任务。  上次自家提到了对文本的读写等1密密麻麻操作,回顾下,要想从文件内读取内容无论是read如故readline,读抽取来的是还是不是都是字符串呢?那么一旦想让字典、列表这一个数据类型保存进文件到读抽取来都以原来的类型不改变吗?那时大家推荐三个pytho新的模块,化解这些难点!

  自身小白一枚,随着现在对测试供给越来越高,动不动将要去会一门编程语言,不可能只好学习学习Python,前几日观察多少个月前还是新手的人意想不到就曾经能应用Python写轻巧系统了,不可能,固然事先也轻便学习过Python,可是依然怒了,近日径直再看鱼C专门的学业室的Python教程,为何看这么些?没怎么,因为上课没那么粗笨咯,于是乎就找那些摄像来探望,唯1的短处就是练习题要钱,坑4858.com ,~~~~不能,没钱人家怎么继续玩下去啊,好了不说废话了,进入前日的焦点,由于事先27课看过了,也没写博客,不能够只可以从2八课写起了,假如现在倍感还足以的话再补吗!注意:Python是叁+版本的喔

  一、三个任务

 
代码清单壹:

  pickle的真相就是使用部分算法将您的数目对象调换成2进制文件,积存在磁盘上,也可存在数据库大概别的机器上。

  明天关键讲的是Python操作文件,大家想转手既然是文本那我们明显要“张开”啊是否,展开那英女士文单词是吗?Open对不对,没有错啦,那展开啥啊?所以open前边是否得加文件路线?没有错,那随着文件展开了那您是想干嘛呢?(读、写?)所以,最基本的展开五个因素就来了嘛,如下,一般open(‘文件路线’,‘展开药格局’)那样既可,其他暗中认可。

  贰、课时2玖课后习题及答案

#打开record.txt文件
f = open('E:\\python\\record.txt')  

#定义3个变量,并对它们初始化
boy = []     
girl = []
count = 0

#循环读取文件
for each_line in f:

  #如果当前内容不"======",则继续读取内容;否则读取,开始写操作
  if each_line[:6] != "======":            

    #读取的内容以":"进行分割,分割后分别赋值给元组元素role和spoken
    (role,spoken) = each_line.split(':',1) 

    #如果对话角色为"小甲鱼",则将文件追加到boy列表中
    if role == '小甲鱼':                  
       boy.append(spoken)

    #如果对话角色为"小客服",则将文件追加到girl列表中
    if role == '小客服':                   
       girl.append(spoken)
  else:
     #定义输出文件名称
     file_name_boy = 'boy_'+str(count)+'.txt'  
     file_name_girl = 'girl'+str(count)+'.txt' 

     #打开文件
     boy_file = open(file_name_boy,'w')         
     girl_file = open(file_name_girl,'w')     

     #writelines的参数是序列(比如列表),它会迭代帮你写入文件。
     boy_file.writelines(boy)     
     girl_file.writelines(girl) 

     #关闭文件对象
     boy_file.close()                                   
     girl_file.close()                          

     #当前写操作完毕后,必须进行初始化操作,以准备下一个的写入操作
     boy = []
     girl = []
     count += 1

#因为第三段对话的结尾没有"===",所以需要再次进行上门的重复写操作,保存第三段对话
#定义输出文件名称     
file_name_boy = 'boy_'+str(count)+'.txt'  
file_name_girl = 'girl'+str(count)+'.txt'  

#打开文件    
boy_file = open(file_name_boy,'w')         
girl_file = open(file_name_girl,'w') 

#writelines的参数是序列(比如列表),它会迭代帮你写入文件。     
boy_file.writelines(boy)   
girl_file.writelines(girl) 

#关闭文件对象      
boy_file.close()                                
girl_file.close()                    

#关闭文件对象
f.close()   

  pickling(存放):能够将python的对象以二进制流格局存放在文书内

4858.com 1

 

  代码清单二:

  unpickling(读取):将文件内的贰进制流调换为目标

举例我们open时张开方式不填写就代表只读,即为’r’,来看一看上边,这么七种展开形式总有你喜欢的吧^-^

****************

#定义一个保存文件的方法
def save_file(boy,girl,count):

   #定义输出文件名称
   file_name_boy = 'boy_'+str(count)+'.txt'   
   file_name_girl = 'girl'+str(count)+'.txt'

   #打开文件
   boy_file = open(file_name_boy,'w')         
   girl_file = open(file_name_girl,'w')

   #writelines的参数是序列(比如列表),它会迭代帮你写入文件。   
   boy_file.writelines(boy)     
   girl_file.writelines(girl)  

   #关闭文件对象     
   boy_file.close()                                  
   girl_file.close() 

#定义一个读取和分割文件内容的方法   
def read_file(filename):

   #打开record.txt文件
   f = open('E:\\python\\record.txt')  

   #定义3个变量,并对它们初始化
   boy = []     
   girl = []
   count = 0

   #循环读取文件
   for each_line in f:

   #如果当前内容不"======",则继续读取内容;否则读取,开始写操作
   if each_line[:6] != "======": 

      #读取的内容以":"进行分割,分割后分别赋值给元组元素role和spoken   
      (role,spoken) = each_line.split(':',1)

      #如果对话角色为"小甲鱼",则将文件追加到boy列表中
      if role == '小甲鱼':                 
         boy.append(spoken)

      #如果对话角色为"小客服",则将文件追加到girl列表中
      if role == '小客服':                 
         girl.append(spoken)

   else:
       #保存文件
       save_file(boy,girl,count)     

       #保存完文件后,再初始化变量       
       boy = []
       girl = []
       count += 1

   #因为第三段对话的结尾没有"===",所以需要再调用save_file方法,保存第三段对话
   save_file(boy,girl,count)

   #关闭文件对象
   f.close()

#主方法:只要调用read_file就可以完成所有的操作
read_file('E:\\python\\record.txt')  

 1、上面是存放在list一那么些列表到d盘test.pkl文件内:

4858.com 2

一、一个任务

  难题延伸: 如下图:为何boy[]、girl[]、count地方不一样,结果完全两样啊?

4858.com 3

  哎呀呀,张开完文件后,那你想下大家要干嘛呢?读文件内容依旧写东西进去文件对不?因而就有了上面方法,哎,专门的学业术语叫文件对象方法,老年记者不住专门的学问名称,你们可得记住哟!还有即使Python有垃圾回收机制,可是咱们编辑读取文件时,落成操作后记得关闭文件哟,不然突然断电那内部存款和储蓄器内的数量只是会丢掉的喔,因为我们编辑的时候是保存在内部存款和储蓄器的,唯有关门文件时才会保留到地头!

****************

  4858.com 4

记得张开文件要以2进制情势展开(b)

4858.com 5

职务:将文件(record.txt)中的数据进行分割并遵照以下规律保存起来:

  原因剖析:
 
 因为boy,girl,count四个变量是做为split_file()函数的一部分变量,当把它们位于split_file()里面包车型大巴时候,是对三个变量举行了早先化。
 
 然而当您把它们放到下边save_file()函数里面包车型客车时候,便是在save_file()函数里面重新定义了多个称呼boy,
girl,count的变量,
 
 那么它和split_file()函数里面包车型客车变量是一点1滴未有提到的。

pickle.dump(obj, file, [,protocol])
  注脚:将对象obj保存到文件file中去。
     protocol为种类化使用的商业事务版本,0:ASCII协议,所体系化的对象使用可打字与印刷的ASCII码表示;一:老式的二进制协议;贰:二.3本子引进的新2进制协议,较以前的更连忙。当中协议0和1包容老版本的python。protocol暗中认可值为0。
     file:对象保存到的类公事对象。file必须有write()接口, file可以是一个以’w’方式展开的公文或然2个StringIO对象大概其它任何落成write()接口的目标。如果protocol>=1,文件对象供给是2进制情势展开的。

 说了那般多,接下去有道标题很有趣。尝试着去做到吧^-^

(1)小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)

 

贰、下边是从文件内读取刚刚保存的列表:

职分:将文件(record.txt)中的数据实行私分并根据以下规律保存起来:
小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
文件中累计有叁段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt,
girl_2.txt, boy_3.txt,
gril_三.txt共四个公文(提醒:文件中分化的对话间业已采纳“==========”分割)

(2)小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)

4858.com 6

record.txt文件内容如下:

(三)文件中累计有3段对话,分别保存为boy_1.txt,
girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt,
gril_三.txt共八个文本(提醒:文件中不一致的对话间已经应用“==========”分割)

照例是以二进制方式读取文件(rb)

小客服:小甲鱼,今天有客户问你有没有女朋友?
小甲鱼:咦??
小客服:我跟她说你有女朋友了!
小甲鱼:。。。。。。
小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~"
小甲鱼:然后呢?
小客服:她买了两个,说发一个货就好~
小甲鱼:呃。。。。。。你真牛!
小客服:那是,谁让我是鱼C最可爱小客服嘛~
小甲鱼:下次有人想调戏你我不阻止~
小客服:滚!!!
================================================================================
小客服:小甲鱼,有个好评很好笑哈。
小甲鱼:哦?
小客服:"有了小甲鱼,以后妈妈再也不用担心我的学习了~"
小甲鱼:哈哈哈,我看到丫,我还发微博了呢~
小客服:嗯嗯,我看了你的微博丫~
小甲鱼:哟西~
小客服:那个有条回复“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^”
小甲鱼:T_T
================================================================================
小客服:小甲鱼,今天一个会员想找你
小甲鱼:哦?什么事?
小客服:他说你一个学生月薪已经超过12k了!!
小甲鱼:哪里的?
小客服:上海的
小甲鱼:那正常,哪家公司?
小客服:他没说呀。
小甲鱼:哦
小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!!
小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。
小客服:滚!!!
f = open('record.txt')

boy = []
girl = []
count = 1

for each_line in f:
    if each_line[:6] != '======':
        (role, line_spoken) = each_line.split(':', 1)
        if role == '小甲鱼':
            boy.append(line_spoken)
        if role == '小客服':
            girl.append(line_spoken)
    else:
        file_name_boy = 'boy_' + str(count) + '.txt'
        file_name_girl = 'girl_' + str(count) + '.txt'

        boy_file = open(file_name_boy, 'w')
        girl_file = open(file_name_girl, 'w')

        boy_file.writelines(boy)
        girl_file.writelines(girl)

        boy_file.close()
        girl_file.close()

        boy = []
        girl = []
        count += 1

file_name_boy = 'boy_' + str(count) + '.txt'
file_name_girl = 'girl_' + str(count) + '.txt'

boy_file = open(file_name_boy, 'w')
girl_file = open(file_name_girl, 'w')

boy_file.writelines(boy)
girl_file.writelines(girl)

boy_file.close()
girl_file.close()

f.close()

pickle.load(file)
  注明:从file中读取三个字符串,并将它重构为本来的python对象。
  file:类公事对象,有read()和readline()接口。

如上即为文件内容,尝试着写出地点的代码吧,答案如下:

其实能够应用函数封装得更加赏心悦目些:

 

#coding=utf-8
def writefile(girl_list,boy_list,count):

    girl_file = open(r'D:\girl_'+ str(count) +'.txt','w')

    boy_file = open(r'D:\boy_'+ str(count) +'.txt','w')
    girl_file.writelines(girl_list)
    boy_file.writelines(boy_list)


    girl_file.close()
    boy_file.close()

def split_file():
    boy_list = []
    girl_list = []
    count = 1
    f = open(r'D:\record.txt')

    for each_line in f:
        if each_line[:6] != '======':
            (name,content) = each_line.split(':',1)
            if name == '小客服':
                girl_list.append(each_line)

            else:
                boy_list.append(each_line)


        else:
            writefile(girl_list,boy_list,count)
            boy_list.clear()
            girl_list.clear()
            count += 1
    writefile(girl_list,boy_list,count)
    f.close()

split_file()
def save_file(boy, girl, count):
    file_name_boy = 'boy_' + str(count) + '.txt'
    file_name_girl = 'girl_' + str(count) + '.txt'

    boy_file = open(file_name_boy, 'w')
    girl_file = open(file_name_girl, 'w')

    boy_file.writelines(boy)
    girl_file.writelines(girl)

    boy_file.close()
    girl_file.close()


def split_file(file_name):
    f = open('record.txt')

    boy = []
    girl = []
    count = 1

    for each_line in f:
        if each_line[:6] != '======':
            (role, line_spoken) = each_line.split(':', 1)
            if role == '小甲鱼':
                boy.append(line_spoken)
            if role == '小客服':
                girl.append(line_spoken)
        else:
            save_file(boy, girl, count)

            boy = []
            girl = []
            count += 1

    save_file(boy, girl, count)

    f.close()


split_file('record.txt')

练习题:将文件(record.txt)中的数据接纳pickle将文件分割成区别文件:

 上面的代码只是个体写的而已,记住代码的写法未有最佳,唯有越来越好,努力优化本身的代码吧。好了,介绍了文本的为主读写,那么接下去就活该介绍下相对应的文件系统了。

 

小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
文件中一齐有3段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt,
girl_2.txt, boy_3.txt,
gril_三.txt共5个文件(提醒:文件中区别的对话间业已运用“==========”分割)

4858.com 7

*******************************

record.txt文件内容如下:

 大家千万不要烦恼,沉住气看完,看完后笔者会在后边留几道题加强大家学习,一同尽力吗!

二、课时2九课后习题及答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
小客服:小甲鱼,今天有客户问你有没有女朋友?
小甲鱼:咦??
小客服:我跟她说你有女朋友了!
小甲鱼:。。。。。。
小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~"
小甲鱼:然后呢?
小客服:她买了两个,说发一个货就好~
小甲鱼:呃。。。。。。你真牛!
小客服:那是,谁让我是鱼C最可爱小客服嘛~
小甲鱼:下次有人想调戏你我不阻止~
小客服:滚!!!
================================================================================
小客服:小甲鱼,有个好评很好笑哈。
小甲鱼:哦?
小客服:"有了小甲鱼,以后妈妈再也不用担心我的学习了~"
小甲鱼:哈哈哈,我看到丫,我还发微博了呢~
小客服:嗯嗯,我看了你的微博丫~
小甲鱼:哟西~
小客服:那个有条回复“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^”
小甲鱼:T_T
================================================================================
小客服:小甲鱼,今天一个会员想找你
小甲鱼:哦?什么事?
小客服:他说你一个学生月薪已经超过12k了!!
小甲鱼:哪里的?
小客服:上海的
小甲鱼:那正常,哪家公司?
小客服:他没说呀。
小甲鱼:哦
小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!!
小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。
小客服:滚!!!

4858.com 8

*******************************

以上即为文件内容,尝试着写出地点的代码吧,答案如下:

 

4858.com 9

4858.com 10

顺手多少个难点,我们能够做到下看看,最终二个略带有点复杂:

4858.com 11

#coding=utf-8
def writefile(girl_list,boy_list,count):

    girl_file = open(r'D:\girl_'+ str(count) +'.txt','wb')

    boy_file = open(r'D:\boy_'+ str(count) +'.txt','wb')
    girl_file.dump(girl_list,girl_file)
    boy_file.dump(boy_list,boy_file)


    girl_file.close()
    boy_file.close()

def split_file(file_name):
    boy_list = []
    girl_list = []
    count = 1
    f = open(file_name)

    for each_line in f:
        if each_line[:6] != '======':
            (name,content) = each_line.split(':',1)
            if name == '小客服':
                girl_list.append(each_line)

            else:
                boy_list.append(each_line)


        else:
            writefile(girl_list,boy_list,count)
            boy_list.clear()
            girl_list.clear()
            count += 1
    writefile(girl_list,boy_list,count)
    f.close()

split_file('D:\\record.txt')

①、编写三个主次,总计目录下各种文件类型的文件数;

4858.com 12

 

4858.com 13

贰、编写三个程序,用户输入文件名以及初叶寻觅的路线,寻找该公文是或不是留存,如境遇文件夹则进入文件夹继续查找。

4858.com 14

 

4858.com 15

叁、编写一个程序,用户输加入关贸总协定组织键字,查找当前文件夹内(假如当前文件夹内富含文件夹则进入文件夹继续搜寻)全部含有该重大字的公文文件(.txt后缀),供给出示该公文所在的地点以及关键字在文书中的具体地点(第几行第多少个字符)

4858.com 16

 

4858.com 17

 

4858.com 18

答案:

4858.com 19

率先题答案:

4858.com 20

#coding=utf-8
#1:编写一个程序,统计当前目录下每个文件类型的文件数

import os
import os.path as op

def file_num(mulu_role='D:\\'):
    file_houzhui = []
    filejia_count = 0
    for wenjian in os.listdir(mulu_role):
        file_luji = op.join(mulu_role,wenjian)
        print(wenjian)
        if  op.isdir(file_luji):
            filejia_count += 1
        else:
            (filename_first,filename_last) = op.splitext(wenjian)
            file_houzhui.append(filename_last)
    if filejia_count >= 1:
        print('该文件下共有类型为【文件夹】的文件 %d个' %(filejia_count))
    houzhui = list(set(file_houzhui))
    for file_leixing in houzhui:
        file_count = file_houzhui.count(file_leixing)
        print('该文件下共有类型为【%s】的文件 %d个' %(file_leixing,file_count))

mulu_role = input('请输入你想查询的目录(默认D盘):')

file_num(mulu_role)

4858.com 21

 

4858.com 22

其次题答案:

 

#coding=utf-8
import os


def search_file(start_dir,target):
    os.chdir(start_dir)

    for each_file in os.listdir(os.curdir) :
        if each_file == target:
            print(os.getcwd()  + os.sep + each_file) #sep是路径分隔符
        if os.path.isdir(each_file):
            search_file(each_file,target) #递归调用
            os.chdir(os.pardir) #递归调用后返回上一层目录


start_dir = input('请输入要查询的初始目录:')
target = input('请输入需要查找的目标文件:')
search_file(start_dir,target)

 

其三题答案:

#coding=utf-8

import os

def print_pos(key_dict):
    keys = key_dict.keys()
    keys = sorted(keys) #由于字典是无序的,这里对行数进行排序
    for each_key in kyes:
        print('关键字出现在第 %s 行,第 %s 个位置。'%(each_key,str(key_dict[each_key])))

def pos_in_line(line,key):
    pos = []
    begin = line.find(key)
    while begin != -1:
        pos.append(begin + 1) #用户的角度从1开始数
        begin = line.find(key,begin+1) #从下一个位置继续查找

    return pos

def search_in_file(file_name,key):
    f = open(file_name)
    count = 0 #记录行数
    key_dict = dict() #用户存放key所在具体行数对应具体位置

    for each_line in f:
        count += 1
        if key in each_line:
            pos = pos_in_line(each_line,key) #key每行对应的位置
            key_dict[count] = pos

    f.close()
    return key_dict


def search_files(key,detail):
    all_files = os.walk(os.getcwd())
    txt_files = []

    for i in all_files:
        for each_file in i[2]:
            if os.path.splitext(each_file)[1] == '.txt': #根据后缀判断是否文本文件
                each_file = os.path.join(i[0],each_file)
                txt_files.append(each_file)

    for each_txt_file in txt_files:
        key_dict = search_in_file(each_txt_file,key)
        if key_dict:
            print('=================================================')
            print('在文件【%s】中找到关键字【%s】'%(each_txt_file,key))
            if detail in ['YES','Yes','yes']:
                print_pos(key_dict)


key = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
detail = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):'%key)
search_files(key,detail)

评释:该文书档案的图形来源于鱼C工作室的录制,地址为:

  

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有