马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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’方式打开,不然无法写入。我的代码有一个不完美的地方,大家可以试一试将调用函数的顺序改变,文件夹中的内容也会改变。这是因为我按照文件指针偏移的方向依次将三段话存在了文件中,如果改变了调用函数的顺序,文件指针的偏移方向不会变,但对应的储存文件就变了。最后,欢迎大家一起讨论交流,针对我的代码的漏洞或者我没想到的地方给予建议,有什么疑问可以在下方留言交流,谢谢!
|