鱼C论坛

 找回密码
 立即注册
查看: 3095|回复: 17

[已解决]有跟文件的分割,并追加到列表,列表为空的问题

[复制链接]
发表于 2016-3-28 12:40:57 | 显示全部楼层 |阅读模式

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

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

x
根据老师上课时,所打印的代码,这些代码的问题在哪里?而且 在for循环中print  boy列表的循环,无任何打印
f = open('E:\\redoct.txt','r')
boy = []
girl = []
count = 1
for each_line in f:
    if each_line[:6] != '======':
        
        (role,spoken)= each_line.split(':',1)
       
        if role == '小甲鱼':
            boy.extend(spoken)
            print boy##这个没有任何打印
        if role == '小客服':
            girl.append(spoken)
            print girl
    else:
        file_boy_name = 'boy_' + str(count) + '.txt'
        file_girl_name = 'girl_' + str(count) + '.txt'
        print file_boy_name

        boyf = open('file_boy_name','w')
        girlf = open('file_girl_name','w')

        boyf.writelines(boy)
        girlf.writelines(girl)

        boyf.close()
        girlf.close()

        boy = []
        girl = []
        count += 1

f.close()
最佳答案
2016-3-29 09:50:49
仙人掌的花go 发表于 2016-3-28 17:36
不是 ,想要的是小甲鱼老师的那个打印出来的结果 ,开始append的不行,后来换成这个了.....

这个代码写的有不少问题,
1. 首先print函数如果是python 3的话,应该是要用括号的,例如print(x) 而不是print x(如果是python 2.x 那当我没说)
2. 其次在21,22行这里,如果按照你这个写法,那么打开的文件,其文件名会是'file_boy_name'和'file_girl_name'而不是'boy_' +str(count) + '.txt'
对这些基本语法,我稍微帮你改了改,你修改下文件目录应该就能跑了
f = open('D:\\record.txt','r')
boy = []
girl = []
count = 1
for each_line in f:
    if each_line[:6] != '======':
        
        (role,spoken)= each_line.split(':',1)
       
        if role == '小甲鱼':
            boy.append(spoken)
            print(boy)
        if role == '小客服':
            girl.append(spoken)
            print(girl)
    else:
        file_boy_name = 'boy_' + str(count) + '.txt'
        file_girl_name = 'girl_' + str(count) + '.txt'
        print(file_boy_name)

        boyf = open(file_boy_name,'w')
        girlf = open(file_girl_name,'w')

        boyf.writelines(boy)
        girlf.writelines(girl)

        boyf.close()
        girlf.close()

        boy = []
        girl = []
        count += 1

f.close()
3. 这个程序还会错过第二个=======之后的内容(这个问题你自己想想看)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-3-28 17:20:25 | 显示全部楼层
f = open('E:\\redoct.txt','r')
应该是record.txt吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-28 17:27:45 | 显示全部楼层
你这个第11行使用extend方法的话,会把字符串当做一个List附在boy后面,这是你想要的结果么?
比如:
boy = []
boy.extend('好好学习python')
得到的boy会是:
['好', '好', '学', '习', 'p', 'y', 't', 'h', 'o', 'n']
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-28 17:33:49 | 显示全部楼层
holdme 发表于 2016-3-28 17:27
你这个第11行使用extend方法的话,会把字符串当做一个List附在boy后面,这是你想要的结果么?
比如:

开始用append 追加进去,才用这个的 extend的这个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-28 17:34:40 | 显示全部楼层
~风介~ 发表于 2016-3-28 17:20
应该是record.txt吧?

这个是重新命名的 ,忘记老师的了 就用了这个名字
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-28 17:36:05 | 显示全部楼层
holdme 发表于 2016-3-28 17:27
你这个第11行使用extend方法的话,会把字符串当做一个List附在boy后面,这是你想要的结果么?
比如:

不是 ,想要的是小甲鱼老师的那个打印出来的结果 ,开始append的不行,后来换成这个了.....
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-29 09:50:49 | 显示全部楼层    本楼为最佳答案   
仙人掌的花go 发表于 2016-3-28 17:36
不是 ,想要的是小甲鱼老师的那个打印出来的结果 ,开始append的不行,后来换成这个了.....

这个代码写的有不少问题,
1. 首先print函数如果是python 3的话,应该是要用括号的,例如print(x) 而不是print x(如果是python 2.x 那当我没说)
2. 其次在21,22行这里,如果按照你这个写法,那么打开的文件,其文件名会是'file_boy_name'和'file_girl_name'而不是'boy_' +str(count) + '.txt'
对这些基本语法,我稍微帮你改了改,你修改下文件目录应该就能跑了
f = open('D:\\record.txt','r')
boy = []
girl = []
count = 1
for each_line in f:
    if each_line[:6] != '======':
        
        (role,spoken)= each_line.split(':',1)
       
        if role == '小甲鱼':
            boy.append(spoken)
            print(boy)
        if role == '小客服':
            girl.append(spoken)
            print(girl)
    else:
        file_boy_name = 'boy_' + str(count) + '.txt'
        file_girl_name = 'girl_' + str(count) + '.txt'
        print(file_boy_name)

        boyf = open(file_boy_name,'w')
        girlf = open(file_girl_name,'w')

        boyf.writelines(boy)
        girlf.writelines(girl)

        boyf.close()
        girlf.close()

        boy = []
        girl = []
        count += 1

f.close()
3. 这个程序还会错过第二个=======之后的内容(这个问题你自己想想看)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-29 11:53:44 | 显示全部楼层
holdme 发表于 2016-3-29 09:50
这个代码写的有不少问题,
1. 首先print函数如果是python 3的话,应该是要用括号的,例如print(x) 而不 ...

谢谢 第二个问题 已经发现了 ,
忘记告诉你,我的环境是2.7的 谢谢你 ,
但是怎么也想不明白为什么追加不到列表中
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-30 08:13:17 | 显示全部楼层
holdme 发表于 2016-3-29 09:50
这个代码写的有不少问题,
1. 首先print函数如果是python 3的话,应该是要用括号的,例如print(x) 而不 ...

3. 这个程序还会错过第二个=======之后的内容.............
这个问题还是想不到,告诉我答案吧 泪奔了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-30 08:55:31 | 显示全部楼层
我之前上这节视频课的时候写的,比较简陋,供参考:
import os
os.chdir(r'C:\Users\LUOZ1CHAO\Desktop\practice Python\fishC\class29')
i = 1
with open('record.txt','r') as f:
    f_b = open('boy_'+str(i)+'.txt','w')
    f_g = open('girl_'+str(i)+'.txt','w')    
    for each_line in f:
        try:            
            (name, words)=each_line.split(":",1)
            if name == '小甲鱼':
                f_b.write(words)
            elif name == '小客服':
                f_g.write(words)
        except ValueError:
            f_b.close()
            f_g.close()            
            i = i + 1
            f_b = open('boy_'+str(i)+'.txt','w')
            f_g = open('girl_'+str(i)+'.txt','w')  
            pass
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-31 09:06:05 | 显示全部楼层
holdme 发表于 2016-3-30 08:55
我之前上这节视频课的时候写的,比较简陋,供参考:

知道哪里错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-31 13:51:02 | 显示全部楼层

哈哈,一起学习,共同进步!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-31 16:25:54 | 显示全部楼层
holdme 发表于 2016-3-29 09:50
这个代码写的有不少问题,
1. 首先print函数如果是python 3的话,应该是要用括号的,例如print(x) 而不 ...

@冬雪雪冬 请帮忙看一下程序为什么会  错过第二个=======之后的内容
开始以为是分割之后换行了,所有的角色都不是小客服或者小甲鱼,以造成后面的if语句不执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-31 17:55:27 | 显示全部楼层
仙人掌的花go 发表于 2016-3-31 16:25
@冬雪雪冬 请帮忙看一下程序为什么会  错过第二个=======之后的内容
开始以为是分割之后换行了,所有的 ...

因为程序是读到====之后才做文件输出,第一段和段二段都可正常执行,第三段后面没有=====,就没有输出了。可以在循环之后单独把文件操作部分再做一次。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-3-31 21:57:54 | 显示全部楼层
冬雪雪冬 发表于 2016-3-31 17:55
因为程序是读到====之后才做文件输出,第一段和段二段都可正常执行,第三段后面没有=====,就没有输出了 ...

谢谢 明白了 但是这块还是不能执行,是什么原因
if role == '小甲鱼':
            print 'aaa'
            boy.append(spoken)
           
        if role == '小客服':
            girl.append(spoken)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-31 22:20:19 | 显示全部楼层
仙人掌的花go 发表于 2016-3-31 21:57
谢谢 明白了 但是这块还是不能执行,是什么原因

我这里是可以打印的。有可能你的record.txt文件的问题。
在if语句前,先打印role看看实际的内容是什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-4 20:39:48 | 显示全部楼层
仙人掌的花go 发表于 2016-3-31 21:57
谢谢 明白了 但是这块还是不能执行,是什么原因


一种可能的原因:(role,spoken)= each_line.split(':',1)这里的":"与文本文件里的“:”不同(中英文冒号不同),导致split()函数执行后没有结果(理论解释器应该报错)所以两个if语句均不成立,你在(role,spoken)= each_line.split(':',1)后面打印输入下role,spoken就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-4-4 21:39:44 | 显示全部楼层
小小大鱼 发表于 2016-4-4 20:39
一种可能的原因:(role,spoken)= each_line.split(':',1)这里的":"与文本文件里的“:”不同(中英文冒 ...

嗯,开始的时就这么处理的,后来才发现是版本的问题,换成3之后,就能追加进去了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-18 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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