零基础学习python_文件(28-30课)

  本人小白一枚,随着现在对测试要求越来越高,动不动就要去会一门编程语言,没办法只能学习学习Python,今天看到几个月前还是菜鸟的人突然就已经能使用Python写简单系统了,没办法,虽然之前也简单学习过Python,但是还是怒了,最近一直再看鱼C工作室的Python教程,为啥看这个?没为啥,因为讲解没那么死板咯,于是乎就找这个视频来看看,唯一的缺点就是练习题要钱,坑~~~~没办法,没钱人家怎么继续玩下去呢,好了不说废话了,进入今天的主题,由于之前27课看过了,也没写博客,没办法只能从28课写起了,如果日后感觉还可以的话再补吧!注意:Python是3+版本的喔

  今天主要讲的是Python操作文件,大家想一下既然是文件那我们肯定要“打开”啊是不是,打开那英文单词是啥?Open对不对,没错啦,那打开啥呢?所以open后面是不是得加文件路径?没错,那接着文件打开了那你是想干嘛呢?(读、写?)所以,最基本的打开两个要素就来了呗,如下,一般open(‘文件路径’,‘打开方式’)这样既可,其余默认。

如果我们open时打开模式不填写就代表只读,即为'r',来看一看下面,这么多种打开模式总有你喜欢的吧^-^

  哎呀呀,打开完文件后,那你想下我们要干嘛呢?读文件内容或者写东西进入文件对不?因此就有了下面方法,哎,专业术语叫文件对象方法,老记不住专业名称,你们可得记住哟!还有虽然Python有垃圾回收机制,但是我们编辑读取文件时,完成操作后记得关闭文件哟,不然突然断电那内存内的数据可是会不见的喔,因为我们编辑的时候是保存在内存的,只有关闭文件时才会保存到本地!

 说了这么多,接下来有道题目很好玩。尝试着去完成吧^-^

任务:将文件(record.txt)中的数据进行分割并按照以下规律保存起来:
小甲鱼的对话单独保存为boy_*.txt的文件(去掉“小甲鱼:”)
小客服的对话单独保存为girl_*.txt的文件(去掉“小客服:”)
文件中总共有三段对话,分别保存为boy_1.txt, girl_1.txt,boy_2.txt, girl_2.txt, boy_3.txt, gril_3.txt共6个文件(提示:文件中不同的对话间已经使用“==========”分割)

record.txt文件内容如下:

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

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

#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:oy_'+ 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:
ecord.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()

 上面的代码只是个人写的而已,记住代码的写法没有最好,只有更好,努力优化自己的代码吧。好了,介绍了文件的基本读写,那么接下来就应该介绍下相对应的文件系统了。

 大家千万不要烦恼,沉住气看完,看完后我会在后面留几道题巩固大家学习,一起努力吧!

附带几个题目,大家可以完成下看看,最后一个稍微有点复杂:

1、编写一个程序,统计目录下每个文件类型的文件数;

2、编写一个程序,用户输入文件名以及开始搜索的路径,搜索该文件是否存在,如遇到文件夹则进入文件夹继续搜索。

3、编写一个程序,用户输入关键字,查找当前文件夹内(如果当前文件夹内包含文件夹则进入文件夹继续搜索)所有含有该关键字的文本文件(.txt后缀),要求显示该文件所在的位置以及关键字在文件中的具体位置(第几行第几个字符)

答案:

第一题答案:

#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)
    
    

第二题答案:

#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工作室的视频,地址为:http://blog.fishc.com/category/python。

  

原文地址:https://www.cnblogs.com/leixiaobai/p/7739897.html