关于用Python的txt文字的提炼过程的不理解之处
想在以下文档按对话者提炼对话内容至新的txt文本文件(暂不考虑pickle“腌制”):看见鱼总发的《零基础入门学习Python(第031讲)》答案是这样写的:
for each_line in f:
if each_line[:6] != '======':
(role, line_spoken) = each_line.split(':', 1)
if role == '小甲鱼':
boy.append(line_spoken)
if role == '小客服':
girl.append(line_spoken)
1.我一直弄不明白这样的迭代是迭代文件中的每一行还是迭代文件中的每一个字符?
2.我单独运行了以下的代码,为什么boy列表的每个字符串最后都会多出\n换行符,明明每个“小甲鱼”前面没有换行?
>>> f = open('record.txt')
>>> boy = []
>>> girl = []
>>> for each_line in f:
if each_line[:6] != '======':
(role, line_spoken) = each_line.split(':', 1)
if role == '小甲鱼':
boy.append(line_spoken)
if role == '小客服':
girl.append(line_spoken)
>>> boy
['咦??\n', '。。。。。。\n', '然后呢?\n', '呃。。。。。。你真牛!\n', '下次有人想调戏你我不阻止~\n', '哦?\n', '哈哈哈,我看到丫,我还发微博了呢~\n', '哟西~\n', 'T_T\n', '哦?什么事?\n', '哪里的?\n', '那正常,哪家公司?\n', '哦\n', '啊,你说什么?我在外边呢,这里好吵吖。。。。。。\n']
3.我运行了以下的代码,为什么最后列表boy依然为空?
>>> boy
[]
>>> f
<_io.TextIOWrapper name='record.txt' mode='r' encoding='cp936'>
>>> f.read()
''
>>> f.seek(0,0)
0
>>> f.read()
'小客服:小甲鱼,今天有客户问你有没有女朋友?\n小甲鱼:咦??\n小客服:我跟她说你有女朋友了!\n小甲鱼:。。。。。。\n小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~"\n小甲鱼:然后呢?\n小客服:她买了两个,说发一个货就好~\n小甲鱼:呃。。。。。。你真牛!\n小客服:那是,谁让我是鱼C最可爱小客服嘛~\n小甲鱼:下次有人想调戏你我不阻止~\n小客服:滚!!!\n================================================================================\n小客服:小甲鱼,有个好评很好笑哈。\n小甲鱼:哦?\n小客服:"有了小甲鱼,以后妈妈再也不用担心我的学习了~"\n小甲鱼:哈哈哈,我看到丫,我还发微博了呢~\n小客服:嗯嗯,我看了你的微博丫~\n小甲鱼:哟西~\n小客服:那个有条回复“左手拿著小甲魚,右手拿著打火機,哪裡不會點哪裡,so easy ^_^”\n小甲鱼:T_T\n================================================================================\n小客服:小甲鱼,今天一个会员想找你\n小甲鱼:哦?什么事?\n小客服:他说你一个学生月薪已经超过12k了!!\n小甲鱼:哪里的?\n小客服:上海的\n小甲鱼:那正常,哪家公司?\n小客服:他没说呀。\n小甲鱼:哦\n小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!!\n小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。\n小客服:滚!!!'
>>> for each_line in f:
if each_line[:6] != '======':
(role, line_spoken) = each_line.split(':', 1)
boy.append(line_spoken)
>>> boy
[]
望高手指教,谢谢! 1.我一直弄不明白这样的迭代是迭代文件中的每一行还是迭代文件中的每一个字符?
每一行;
2.我单独运行了以下的代码,为什么boy列表的每个字符串最后都会多出\n换行符,明明每个“小甲鱼”前面没有换行?
你看到的是编码后的,如果转成对应编码时才会显示\n,就像你用print()语句是默认是end='\n'也就是打印后默认换行;
3.我运行了以下的代码,为什么最后列表boy依然为空?
你的代码中先执行了f.seek(0,0)再执行f.read(),而执行f.read()时指针已经到了最后的位置,所以后面你boy一直为空的;
你只要把两句代码的执行顺序换下即可! 本帖最后由 Twilight6 于 2020-7-17 15:58 编辑
1.我一直弄不明白这样的迭代是迭代文件中的每一行还是迭代文件中的每一个字符?
看你迭代的对象而定的,当你用 for 循环迭代个文件对象,此时是以行为单位读取的
当你 for 循环是一个不是文件对象,而是其他比如 str字符串、list列表 等可迭代对象,是已可迭代对象元素来进行迭代的,字符串的元素是每一个字符,列表的元素就是列表容器内的各个元素对象
2.我单独运行了以下的代码,为什么boy列表的每个字符串最后都会多出\n换行符,明明每个“小甲鱼”前面没有换行?
因为 \n 是存在于文件每一行最后的一个字符,起到文件的换行作用
而你小甲鱼、小客服是在行首,后面小甲鱼、小客服说的话在行尾,所以你分割出来的小甲鱼、小客服没有带换行符,而说的话有带换行符
3.我运行了以下的代码,为什么最后列表boy依然为空?
因为你前面对文件对象读取了一次全部内容,即你代码中的 f.read() 已经使得文件指针移动到文件末尾,当你再次 f.read() 时候就会返回一个空的文件内容
而空的文件内容 for 循环根本没有执行,更谈不上切割字符串,所以你的 boy 肯定为原本默认的值,你可以使用 seek 函数使得文件指针进行移动,比如 seek(0,0) 就是引动到行首
此时再次执行这个代码就会有结果了
页:
[1]