零基础学习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:\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()
上面的代码只是个人写的而已,记住代码的写法没有最好,只有更好,努力优化自己的代码吧。好了,介绍了文件的基本读写,那么接下来就应该介绍下相对应的文件系统了。
大家千万不要烦恼,沉住气看完,看完后我会在后面留几道题巩固大家学习,一起努力吧!
附带几个题目,大家可以完成下看看,最后一个稍微有点复杂:
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。