鱼C论坛

 找回密码
 立即注册
查看: 2971|回复: 6

文件写入时writelines方法出错

[复制链接]
发表于 2019-3-14 08:48:50 | 显示全部楼层 |阅读模式

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

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

x
自己练习小甲鱼课上的代码,给定一个聊天文件,截取不同角色的聊天内容分别存放。我在读文件的时候明明用的是writelines方法,参数也是list类型,编译总通不过,还说write方法参数应该是一个字符串。具体报错如下(没有权限发图片,暂且发文字):
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-147-7230df073f84> in <module>()
     19             with open(f_file,'w') as f, open(m_file,'w') as m:
     20                 print('boy的类型是%s' % type(boy))
---> 21                 f.writelines(boy)
     22                 m.writelines(girl)
     23                 boy.clear()

TypeError: write() argument must be str, not list

以下是代码:
boy=[]
girl=[]
i=1
count=1

with open('all.txt','r') as all :
    for line in all:
        if line[0] != '=':
            (role, line_spoken)=line.split(':',1)
            if role[1] == '男':
                boy.append([line_spoken+str(count)])
                count+=1
            else:
                girl.append([line_spoken+str(count)])
                count += 1    
        else:
            f_file='f'+str(i)+'.txt'
            m_file='m'+str(i)+'.txt'
            with open(f_file,'w') as f, open(m_file,'w') as m:
                print('boy的类型是%s' % type(boy))
                f.writelines(boy)
                m.writelines(girl)
                boy.clear()
                girl.clear()
            i+=1
            
    f_file='f'+str(i)+'.txt'
    m_file='m'+str(i)+'.txt'
    with open(f_file,'w') as f, open(m_file,'w') as m:
        f.writelines(boy)
        m.writelines(girl)
        boy.clear()
        girl.clear()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-14 08:49:59 | 显示全部楼层
新手表示很纠结,跪求各位大神指导
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-14 08:53:37 | 显示全部楼层
错误提示给的很清楚了,需要传入的是str类型,而不是list
你需要将boy,girl这两个list转换为str才行

转换方法:
boy = ','.join(map(str, boy))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 08:58:31 | 显示全部楼层
BngThea 发表于 2019-3-14 08:53
错误提示给的很清楚了,需要传入的是str类型,而不是list
你需要将boy,girl这两个list转换为str才行

的确 但是我用的是writelines方法 传list类型没错啊 而且我没用write方法 难受
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-14 09:02:38 | 显示全部楼层
Britain_Style 发表于 2019-3-14 08:58
的确 但是我用的是writelines方法 传list类型没错啊 而且我没用write方法 难受

为何我用writelines就没有报这个错?
你的错误提示显示你用的是write
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-14 09:06:35 | 显示全部楼层
BngThea 发表于 2019-3-14 09:02
为何我用writelines就没有报这个错?
你的错误提示显示你用的是write

我也很是奇怪。。我贴了代码 一个write方法都没有啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 08:47:47 | 显示全部楼层
楼主你好,我今天也碰上同样的问题,已经解决了,不知道你最终解决没有,还是在这里答上,希望能帮助以后有需要的朋友。
首先“file.writeline()”函数只接受“list of str”, 其次需要注意的是“list.append()”函数是往list最后添加新元素而不能与其它list拼接。
也就是说在楼主的代码第11和第14行:
boy.append([line_spoken+str(count)])
girl.append([line_spoken+str(count)])

实际上是往boy和girl两个list末尾添加了一个list作为元素,boy 和 girl最终并不是“list of str”,而是“list of list of str”。
而当楼主的代码在第21、22行:
f.writelines(boy)
m.writelines(girl)

使用writeline()函数时,参数不是list of str。至于为什么会报“write()”函数的错,我估计是因为writeline()函数里面调用了write()函数,而write()函数读取参数时发现参数是list而不是str,所以就出现了此报错。
当然,这个报错信息不够清楚。
解决方法很简单,在第11、14行,将append()函数替换为extend()函数便可以了:
boy.extend([line_spoken+str(count)])
girl.extend([line_spoken+str(count)])

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-27 02:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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