|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 heidern0612 于 2018-12-17 10:05 编辑
写的个人心得都是个人思考、猜测、臆断的过程,有错误难免,恳请广大鱼油给予指正。
这一讲比较难,其实很多方法都学过,但是不知道怎么用,看答案的时候恍然大悟,啊,原来这个还可以这么用。
所以学习有的时候是理论有了,动手比较少。有的时候理解艰难涩会的时候,就是敲代码敲的少了。
任何时候或者任何情况下的不理解、学的不好,都是因为代码敲的少。
但简洁也很重要,还是老师的那句话:Don't repeat yourself
以下部分文字摘自网络,只为个人学习使用,不用于任何商业用途。
1、老师视频里的疑问:
小甲鱼老师没有仔细的讲视频里最后(在封装函数之前),
为什么要复制添加创建文件的那步给全局变量里,难道只复制创建文件这一步就可以创建文件了吗?(只复制了for语句里else那一步)
分裂文件的依据呢? 上面虽然有分裂文件的依据,但是for循环好像都循环完了啊?
哎?好像似乎没循环完哈, 第三段对话开始的时候,似乎也进入了for循环的else语句,但是没有else判断了(因为else判断是==六个“=”号),
这里就是小甲鱼老师为什么只复制了下面一段else,没有复制上面if的缘故,因为if判断完了,文件也分裂完了,但是else不符合的情况下,自然就跳到下面的语句了。
其实还有个笨方法:不是靠"======"判断吗?那就在老师视频里txt文件的最尾部再多加一行"======",就不用那么多判断了 ,哈哈。
不废话,上代码分析:
- #打开record.txt文件
- f = open('E:\\record.txt')
-
- #定义3个变量,并对它们初始化
- boy = []
- girl = []
- count = 1
-
- #循环读取文件
- for each_line in f:
-
- #如果当前内容不等于"======",则继续读取内容;否则读取,开始写操作
- if each_line[:6] != "======":
-
- #读取的内容以":"进行分割,分割后分别赋值给元组元素role和spoken
- (role,spoken) = each_line.split(':',1)
-
- #如果对话角色为"小甲鱼",则将文件追加到boy列表中
- if role == '小甲鱼':
- boy.append(spoken)
-
- #如果对话角色为"小客服",则将文件追加到girl列表中
- if role == '小客服':
- girl.append(spoken)
- else:
- #定义输出文件名称
- file_name_boy = 'boy_'+str(count)+'.txt'
- file_name_girl = 'girl_'+str(count)+'.txt'
-
- #打开文件
- boy_file = open(file_name_boy,'w')
- girl_file = open(file_name_girl,'w')
-
- #writelines的参数是序列(比如列表),它会迭代帮你写入文件。
- boy_file.writelines(boy)
- girl_file.writelines(girl)
-
- #关闭文件对象
- boy_file.close()
- girl_file.close()
-
- #当前写操作完毕后,必须进行初始化操作,以准备下一个的写入操作
- boy = []
- girl = []
- count += 1
-
- #因为第三段对话的结尾没有"===",所以需要再次进行上面的重复写操作,保存第三段对话
- #定义输出文件名称
- file_name_boy = 'boy_'+str(count)+'.txt'
- file_name_girl = 'girl'+str(count)+'.txt'
-
- #打开文件
- boy_file = open(file_name_boy,'w')
- girl_file = open(file_name_girl,'w')
-
- #writelines的参数是序列(比如列表),它会迭代帮你写入文件。
- boy_file.writelines(boy)
- girl_file.writelines(girl)
-
- #关闭文件对象
- boy_file.close()
- girl_file.close()
-
- #关闭文件对象
- f.close()
复制代码
定义函数之后的过程:
- #定义一个保存文件的方法
- def save_file(boy,girl,count):
- #定义输出文件名称
- file_name_boy = 'boy_' + str(count) + '.txt'
- file_name_girl = 'girl_' + str(count) + '.txt'
- #打开文件
- boy_file = open('E:\\%s'%file_name_boy,'w')
- girl_file = open('E:\\%s'%file_name_girl,'w')
- #writelines的参数是序列(比如列表),它会迭代帮你写入文件
- boy_file.writelines(boy)
- girl_file.writelines(girl)
- #关闭文件对象
- boy_file.close()
- girl_file.close()
- #定义一个读取和分割文件内容的方法
- def split_file(file_name):
- f = open('E:\\record.txt')
- #定义3个变量,并对它们初始化
- boy = []
- girl = []
- count = 1
- #循环读取文件
- for each_line in f:
- #如果当前内容不等于“======”,则读取内容分割;否则分类保存文件
- if each_line[:6] != '======':
- #读取的内容以“:”进行分割,分割后分别赋值给role和line_spoken
- (role,line_spoken) = each_line.split(':',1)
- #按对话角色分别把spoken追加到不同的表中
- if role == '小甲鱼':
- boy.append(line_spoken)
- if role == '小客服':
- girl.append(line_spoken)
- else:
- #保存文件
- save_file(boy,girl,count)
- #保存文件后,再初始化变量
- count += 1
- boy = []
- girl = []
- #因为第三段对话的结尾没有"===",所以需要再调用save_file方法,保存第三段对话
- save_file(boy,girl,count)
- f.close()
- #主方法:只要调用split_file就可以完成所有的操作
- split_file('E:\\record.txt')
复制代码
这就是我说的,小积木成大擎天柱啊~ 封装之后清爽了许多。
分析动动手答案:
0.编写一个程序,接受用户的输入并保存为新的文件:
先输入文件名,然后打开文件,调用write将输入的字符串写入文件中,以:w作为写完标识符,写完之后调用close函数即完成文件的写入。
- def filewrite(file_name):
- print('请输入内容【单独输入‘:w’保存退出】:')
- f=open(file_name,'w')
- while True:
- a=input()
- if a!=':w':
- f.write('%s'% a)
- else:
- break
-
- f.close()
-
- file_name=input('请输入文件名:')
- filewrite(file_name)
复制代码
1.编写一个程序比较用户输入的两个文件,如果不同,显示出所有不同处的行号与第一个不同字符的位置:
- def compare(fname1,fname2): #这里定义的文件名,就是下面用户交互时输入的文件名,当然能在python目录下最好,不能的话,就得带上路径。
- f1 = open(fname1) #只读模式默认打开
- f2 = open(fname2)
- count = 0 #统计行数
- differ = [] #统计不一样的数量
- for line1 in f1:
- line2 = f2.readline()
- count += 1 #随着行数的变化,count也跟着变化
- if line1 != line2: #2者不相同的话,differ列表就append一个值,假定循环到第二行不相同,就添加一个2的数字元素进differ列表。
- differ.append(count)
-
- f1.close()
- f2.close()
- return differ #把differ列表返给函数。
-
- fname1 = input('请输入需要比较的头一个文件名:')
- fname2 = input('请输入需要比较的另一个文件名:')
-
- differ = compare(fname1,fname2)
-
- lenth = len(differ)
- if len(differ) == 0: #如果上面compare函数中differ返回的是个空列表,判断两个文件相同。
- #注:*这里的differ指的是函数compare内部的differ,不是外部被赋值给compare函数的全局变量differ。
- #实际上,截止到上面那个函数定义完毕后,再出现的differ已经是个新的变量,不是原先的那个differ了。
- print('两个文件完全一样!')
- else:
- print('两个文件共有%d处不同'%len(differ)) #这里几处不同len的是differ列表的长度。
- for each in differ:
- print('第%d行不一样'%each) #这里each代表是differ列表里每一个元素的值。
复制代码
3.编写一个程序,当用户输入文件名和行数(N)后,将该文件的前N行内容打印到屏幕上:
- def file_view(file_name,line_nun):
- print('\n文件%s的前%s的内容如下:\n'%(file_name,line_num))
- f = open(file_name) #打开用户input输入的文件名
- for i in range(int(line_num)):
- print(f.readline(),end='') #注意这里调用的readline,而不是readline的复数形式readlines,所以这里打开的都是单行。
- #结合上面的for循环以及range范围,这里打开的依次就是range范围的文件单行。
-
- f.close()
-
- file_name = input(r'请输入要打开的文件(如C:\\test.txt):')
- line_num = input('请输入需要显示该文件前几行:')
- file_view(file_name,line_num)
复制代码
|
评分
-
查看全部评分
|