鱼C论坛

 找回密码
 立即注册
查看: 2365|回复: 0

[学习笔记] 小甲鱼python第29讲:文件分离

[复制链接]
发表于 2020-2-11 00:32:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 233倔强不秃 于 2020-2-11 00:40 编辑

一、引言:      
       今天视频学到了29集文件操作,小甲鱼在课堂上布置了一个任务:record.txt中有三段对话,已用“=====”隔开(如图),将小甲鱼的话和小客服的话分开,并去掉“小甲鱼:”和“小客服:”,再分别存在boy_1,girl_1,boy_2,girl_2,boy_3,girl_3中。

二、问题分析:
      1.首先看第一个要求,将小甲鱼和小客服的话分开。
         看到这个要求的时候,我脑子里过了一下上节课小甲鱼讲的基本操作:第一步,打开文件,创建文件对象。第二步,可以将文件对象作为一个列表再进行访问,也可以简便一点,直接利用文件指针的移动进行对每一行的遍历。我果断选了第二种。于是乎for each_line in f:,这里的type(each_line) = 'str',所以我又想到了之前对序列的操作——分片。据观察,each_line可以分为each_line[0:4]和each_line[4:],只需要判断each_line[0:4]等于'小甲鱼:' 还是‘小客服:'就行了。这样就完成了要求一。

     2.问题又来了,怎么将三段话分开呢?
        每段话中间都用了“=”分隔,我想这就是突破口。我设置了for循环,每当检索到each_line是‘=’的时候,就break。但是怎么样分别写入三个文件中呢?
     
    3.现在还有一个功能没有实现,就是分别存储。我用了for循环,遇到分隔符就break,这表明每次我只能处理一段对话,那我要处理三段对话岂不是要写三个for循环,而且还要标记文件指针偏移的位置。这样以来,代码量肯定很大,与其这样,我们不如编写一个函数,每次处理一段,调用三次,这样就解决问题了。
  
      
三、源代码:
f = open('F:\\record.txt')

def split_file(boy,girl):
    boy = open('F:\\' +boy+ '.txt','w')
    girl = open('F:\\' +girl+ '.txt','w')
    for each_line in f:
        if '小甲鱼:' == each_line[0:4]:
            boy.write(each_line[4:])       #这里用write和writelines都可以
        elif  '小客服:' == each_line[0:4]:
            girl.write(each_line[4:])
        else:
            break
    boy.close()
    girl.close()
    

split_file('boy_1','girl_1')
split_file('boy_2','girl_2')
split_file('boy_3','girl_3')
f.close()
print('执行完毕!')
    


四、总结:
       这次我个人感觉我的代码比课上的更简洁一点,少了很多步骤,算是比较直接的一种。其中也有一些小细节,比如:设置函数参数的时候是将文件名作为实参进行传递(注意,一定要是字符串形式:split_file('boy_1','girl_1'),不然会报错。)在函数内用形参控制写入哪一个文档的时候用了一个小技巧,视频里也用了这个技巧:boy = open('F:\\' +boy+ '.txt','w'),但是注意,因为我的文件是在函数内打开的,所以不能在调用函数时,将文件名作为实参(split_file(boy_1,girl_1)),而在这里以这种形式:boy = open('F:\\' +str(boy)+ '.txt','w'),这样会报错。当然视频里的用了字符串的split()方法,我非常推荐这种方法,实际上我之前学字符串的时候没记住这个方法,这次忘了。直接用split('=',1),将字符串从‘:’处分隔,非常方便。还有一些细节,比如打开boy和girl的文件一定以‘w’或者‘a’方式打开,不然无法写入。我的代码有一个不完美的地方,大家可以试一试将调用函数的顺序改变,文件夹中的内容也会改变。这是因为我按照文件指针偏移的方向依次将三段话存在了文件中,如果改变了调用函数的顺序,文件指针的偏移方向不会变,但对应的储存文件就变了。最后,欢迎大家一起讨论交流,针对我的代码的漏洞或者我没想到的地方给予建议,有什么疑问可以在下方留言交流,谢谢!

record.txt

record.txt

运行结果:

运行结果:

运行结果:

运行结果:

评分

参与人数 1荣誉 +3 鱼币 +2 贡献 +2 收起 理由
小甲鱼 + 3 + 2 + 2 鱼C有你更精彩^_^

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 00:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表