今天来练习一个关于文件操作的实例:
如下:D盘里存储了一个hello.txt的文件,yhr和zwh共有三段对话,分别以若干’===’分隔,要求:
三段对话的yhr,zwh所说的话单独存储至新的文件:zwh存入boy1,boy2,boy3.txt,而yhr说的话存入girl1,girl2,girl3.txt里。
↓
我的逻辑分析:
1. 首先这个txt文件每个人说的话占一行,如果转化为列表,每一行则是一个对象。但是上篇博客提到把文件对象转化为列表再处理的话,效率太低。文件对象可以每一行每一行的直接分开处理。
↓
2. 于是现在问题分为两个:
A. 每一行单独处理,如何判定是yhr说的话还是zwh说的话呢?观察文档可以看到,无论是yhr还是zwh说的话,开头都有:’人名+:’ 作为组合,其后跟随个人所言。所以想到字符串的split()方法。字符串的基本函数可在我的博客中查找。可以对每一行字符串单独分割,分割后所说的话对应存入一个列表。
split(sep=None,maxsplit=-1)
不带参数默认是以空格为分隔符切片字符串,
如果maxsplit参数有设置,则仅分割maxsplit个字符串
返回切片后的子字符串拼接的结果
B. 怎么把每一段对话分开呢?可以看到这里每一段对话结束后都跟随一个’===’作为结束标志,如此,我们可以利用’===’作为每段分开标志。
↓
由上,可以梳理出大体思路,利用for循环,单独读出一段文本中每一行文字,对美一行文字进行分割等处理。每一段对话结束后,可以执行文本write操作,写入文件。
首先写出分割对话,处理文件的大体函数:
def split_File(filename):
f = open(filename, 'rt')
boy = [] #用来存储每段对话里zwh所说的话
girl = [] #用来存储每段对话里yhr所说的话
f.seek(0, 0) #将游标放置文本开头
count = 1 #用于计数当前对话段数,便于存储对话文件的命名
for eachline in f:
if eachline[:3]!='===': #只要每行头三个字符不是‘===’
(role,spoken)=eachline.split(':',1) #这里进行字符串分割操作
#单独对每行话进行切割 结果存入元组
if role=='yhr':
girl.append(spoken) #对应列表新增说话内容
else:
boy.append(spoken)
else: #只要每行头三个字符是‘===’说明一段对话结束
saveFile(count,boy,girl) #保存文件
boy=[] #清空列表,为下一段对话做准备
girl=[]
count+=1 #计数+1
#这里进行分别保存操作
f.close()
↓
然后就要构造下一个存储文件的函数: saveFile(count,boy,girl)
def saveFile(count,boy,girl):
file_name_boy = 'D:\\boy' + str(count) + '.txt'
file_name_girl = 'D:\\girl' + str(count) + '.txt'
boy_file = open(file_name_boy, 'w')
boy_file.writelines(boy)
boy_file.close()
girl_file = open(file_name_girl, 'w')
girl_file.writelines(girl)
girl_file.close()
↓
最后调用split_File(‘D:\hello.txt’)即可
↓
运行结果: