鱼C论坛

 找回密码
 立即注册
查看: 1416|回复: 14

[已解决]第029讲课堂作业,分割客服问答文件

[复制链接]
发表于 2020-7-14 11:14:37 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 jiong_jiong 于 2020-7-14 13:47 编辑

课堂上,小甲鱼是将字符串分割后,写入boy和girl的两个列表中,再将列表写入文件。
我试着改成,不要列表,直接进行写入。最后并没有生成新文件。
想请教一下我代码哪里出了问题
f = open(r'C:\Users\jiong\Desktop\record.txt','r')


for each in f:
    c = 1
    filenameb='boy_'+str(c)+'.txt'
    filenameg='girl_'+str(c)+'.txt'
    if each[0:6] == '======':
        bfile.close()            #找到分隔符后,对之前的文件进行关闭保存       
        gfile.close()
        c = c+1
    else:
        (role,spoken)=each.split(':',1)
        if role == '小甲鱼':
            bfile = open(filenameb,'w')
            bfile.write(spoken)
        if role == '小客服':
            gfile = open(filenameg,'w')
            gfile.writelines(spoken)

            
f.close()



根据最佳答案改写的:
f = open(r'C:\Users\jiong\Desktop\record.txt')
c=1
##filenameb = 'boy_' + str(c) + '.txt'
##filenameg = 'girl_' + str(c) + '.txt'
##bfile = open(filenameb, 'a')
##gfile = open(filenameg, 'a')这几句放这里的话,filename不会变化,只会生成一个文件

for each in f:
    filenameb = 'boy_' + str(c) + '.txt'
    filenameg = 'girl_' + str(c) + '.txt'
    bfile = open(filenameb, 'a')
    gfile = open(filenameg, 'a')
    if each[0:6] != '======':
        (role,spoken)=each.split(':',1)
        if role == '小甲鱼':
            bfile.write(spoken)
        if role == '小客服':
            gfile.write(spoken)
    else:
        bfile.close()
        gfile.close()
        c +=1
        print('c=%d'%c)
        bfile =open(filenameb,'a')
        gfile =open(filenameg,'a')

bfile.close()
gfile.close()
f.close()
最佳答案
2020-7-14 11:41:43

重新改了下,现在可以生成三个文件了,之前只生成两个是因为 c = 2 在循环内了
f = open(r'C:\Users\jiong\Desktop\record.txt')
bfile = open('boy_1.txt', 'a')
gfile = open('girl_1.txt', 'a')
c = 2
for each in f:
    filenameb = 'boy_' + str(c) + '.txt'
    filenameg = 'girl_' + str(c) + '.txt'
    if each[0:6] == '======':
        bfile.close()  # 找到分隔符后,对之前的文件进行关闭保存
        gfile.close()
        bfile = open(filenameb, 'a')
        gfile = open(filenameg, 'a')
        c += 1
    else:
        (role, spoken) = each.split(':', 1)
        if role == '小甲鱼':
            bfile.write(spoken)
        if role == '小客服':
            gfile.write(spoken)

bfile.close()
gfile.close()
f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-7-14 11:15:55 | 显示全部楼层

'w' 写入是覆盖写入,你应该改成 'a'

用 w 每次循环都会重新创建个空白文件来覆盖上次的文件内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 11:23:03 | 显示全部楼层
Twilight6 发表于 2020-7-14 11:15
'w' 写入是覆盖写入,你应该改成 'a'

用 w 每次循环都会重新创建个空白文件来覆盖上次的文件内容

已改,但是不行。
连空文件都没有。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 11:25:49 | 显示全部楼层
jiong_jiong 发表于 2020-7-14 11:23
已改,但是不行。
连空文件都没有。



f = open(r'C:\Users\jiong\Desktop\record.txt')
bfile = open('boy_1.txt', 'a')
gfile = open('girl_1.txt', 'a')
for each in f:
    c = 2
    filenameb = 'boy_' + str(c) + '.txt'
    filenameg = 'girl_' + str(c) + '.txt'
    if each[0:6] == '======':
        bfile.close()  # 找到分隔符后,对之前的文件进行关闭保存
        gfile.close()
        bfile = open(filenameb, 'a')
        gfile = open(filenameg, 'a')
        c = c + 1
    else:
        (role, spoken) = each.split(':', 1)
        if role == '小甲鱼':
            bfile.write(spoken)
        if role == '小客服':
            gfile.write(spoken)
bfile.close()  # 找到分隔符后,对之前的文件进行关闭保存
gfile.close()
f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 11:29:04 | 显示全部楼层

已测试,还是不行。没有新文件生成。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 11:33:17 | 显示全部楼层
jiong_jiong 发表于 2020-7-14 11:29
已测试,还是不行。没有新文件生成。



你文件内容有问题吧,我测试有生成文件,只不过少了一个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 11:34:55 | 显示全部楼层
Twilight6 发表于 2020-7-14 11:33
你文件内容有问题吧,我测试有生成文件,只不过少了一个

应该不会哦,我课前有写一个很笨的程序,是可以生成的。我又去检查一下了原文件,是OK的。

以下是笨程序
f = open(r'C:\Users\jiong\Desktop\record.txt','r')
b1 = open(r'C:\Users\jiong\Desktop\boy_1.txt','w')
g1 = open(r'C:\Users\jiong\Desktop\girl_1.txt','w')

for each in f:
    if each[0:3] == '小甲鱼':
        b1.write(each[4:])
    elif each[0:3] == '小客服':
        g1.write(each[4:])
    elif each[0:3] == '===':
        f.readline()
        break
b1.close()
g1.close()


b2 = open(r'C:\Users\jiong\Desktop\boy_2.txt','w')
g2 = open(r'C:\Users\jiong\Desktop\girl_2.txt','w')
for each in f:
    if each[0:3] == '小甲鱼':
        b2.write(each[4:])
    elif each[0:3] == '小客服':
        g2.write(each[4:])
    elif each[0:3] == '===':
        f.readline()
        break
b2.close()
g2.close()

b3 = open(r'C:\Users\jiong\Desktop\boy_3.txt','w')
g3 = open(r'C:\Users\jiong\Desktop\girl_3.txt','w')
for each in f:
    if each[0:3] == '小甲鱼':
        b3.write(each[4:])
    elif each[0:3] == '小客服':
        g3.write(each[4:])
    elif each[0:3] == '===':
        f.readline()
        break
b3.close()
g3.close()
f.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 11:36:31 | 显示全部楼层
jiong_jiong 发表于 2020-7-14 11:34
应该不会哦,我课前有写一个很笨的程序,是可以生成的。我又去检查一下了原文件,是OK的。

以下是笨程 ...



先去检查下,我测试正常生成两个,只不过少了一个:

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

使用道具 举报

发表于 2020-7-14 11:41:43 | 显示全部楼层    本楼为最佳答案   

重新改了下,现在可以生成三个文件了,之前只生成两个是因为 c = 2 在循环内了
f = open(r'C:\Users\jiong\Desktop\record.txt')
bfile = open('boy_1.txt', 'a')
gfile = open('girl_1.txt', 'a')
c = 2
for each in f:
    filenameb = 'boy_' + str(c) + '.txt'
    filenameg = 'girl_' + str(c) + '.txt'
    if each[0:6] == '======':
        bfile.close()  # 找到分隔符后,对之前的文件进行关闭保存
        gfile.close()
        bfile = open(filenameb, 'a')
        gfile = open(filenameg, 'a')
        c += 1
    else:
        (role, spoken) = each.split(':', 1)
        if role == '小甲鱼':
            bfile.write(spoken)
        if role == '小客服':
            gfile.write(spoken)

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

使用道具 举报

 楼主| 发表于 2020-7-14 11:47:12 | 显示全部楼层
Twilight6 发表于 2020-7-14 11:33
你文件内容有问题吧,我测试有生成文件,只不过少了一个

我找到了,但是有个问题请教一下。
我那个笨程序,生成的文件就在桌面。

但是您的程序生成在'''***\AppData\Local\Programs\Python\Python38-32'''为什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 11:48:24 | 显示全部楼层
jiong_jiong 发表于 2020-7-14 11:47
我找到了,但是有个问题请教一下。
我那个笨程序,生成的文件就在桌面。

没加 open 准确路径,默认生成在脚本当前文件夹,如果是在 控制台运行,默认保存在 Python 安装路径
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 11:51:18 | 显示全部楼层
Twilight6 发表于 2020-7-14 11:48
没加 open 准确路径,默认生成在脚本当前文件夹,如果是在 控制台运行,默认保存在 Python 安装路径

我没听懂。
按理说,都是在控制台运行的啊。都是写的脚本,然后运行的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-14 11:53:01 | 显示全部楼层
jiong_jiong 发表于 2020-7-14 11:51
我没听懂。
按理说,都是在控制台运行的啊。都是写的脚本,然后运行的。



控制台直接运行是因为控制台这个程序保存在 安装目录

而你运行脚本是因为脚本所在目录是脚本的目录

你运行脚本时候,控制台工作目录会改变成脚本目录
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 11:54:29 | 显示全部楼层
Twilight6 发表于 2020-7-14 11:41
重新改了下,现在可以生成三个文件了,之前只生成两个是因为 c = 2 在循环内了

为什么一定需要先写02/03行呢??之前的问题在哪里?
bfile = open('boy_1.txt', 'a')
gfile = open('girl_1.txt', 'a')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-14 13:46:16 | 显示全部楼层
f = open(r'C:\Users\jiong\Desktop\record.txt')
c=1
##filenameb = 'boy_' + str(c) + '.txt'
##filenameg = 'girl_' + str(c) + '.txt'
##bfile = open(filenameb, 'a')
##gfile = open(filenameg, 'a')这几句放这里的话,filename不会变化,只会生成一个文件

for each in f:
    filenameb = 'boy_' + str(c) + '.txt'
    filenameg = 'girl_' + str(c) + '.txt'
    bfile = open(filenameb, 'a')
    gfile = open(filenameg, 'a')
    if each[0:6] != '======':
        (role,spoken)=each.split(':',1)
        if role == '小甲鱼':
            bfile.write(spoken)
        if role == '小客服':
            gfile.write(spoken)
    else:
        bfile.close()
        gfile.close()
        c +=1
        print('c=%d'%c)
        bfile =open(filenameb,'a')
        gfile =open(filenameg,'a')

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 01:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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