1207139945 发表于 2022-11-26 22:03:31

小甲鱼老版31讲课后习题

问题代码如下:
import pickle

def save_file(boy,girl,count):
    file_name_boy = 'boy_'+str(count)+'.txt'
    file_name_girl = 'girl_'+str(count)+'.txt'

    boy_file=open(file_name_boy, 'wb', encoding='utf-8')#记得一定要加b呀
    girl_file=open(file_name_girl, 'wb', encoding='utf-8')#记得一定要加b呀

    pickle.dump(boy, boy_file)
    pickle.dump(girl, girl_file)

    boy_file.close()
    girl_file.close()

def spilt_file(file_name):
    count=1
    boy=[]
    girl=[]

    f=open(file_name)

    for each_line in f:
      if each_line[:6]!='======':
            (role,line_spoken)=each_line.spilt(':',1)
            if role =='小甲鱼':
                boy.append(line_spoken)
            if role=='小客服':
                girl.append(line_spoken)
            else:
                save_file(boy,girl,count)

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

    save_file(boy,girl,count)
    f.close()
   
spilt_file('31.0record.txt')
   
错误原因:Traceback (most recent call last):
File "C:\Users\12071\Desktop\py代码\学习代码\31.0腌制聊天记录.py", line 40, in <module>
    spilt_file('31.0record.txt')
File "C:\Users\12071\Desktop\py代码\学习代码\31.0腌制聊天记录.py", line 23, in spilt_file
    for each_line in f:
UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 14: illegal multibyte sequence
         

求大佬解答!!!
   
      

ZhKQYu 发表于 2022-11-26 22:28:16

f=open(file_name)
改为
f=open(file_name, "r", encoding="utf-8")

jackz007 发表于 2022-11-26 22:30:33

def spilt_file(file_name):
    count=1
    boy=[]
    girl=[]

    f=open(file_name , encoding = 'UTF-8')# 改这一句

lxping 发表于 2022-11-26 22:30:48

本帖最后由 lxping 于 2022-11-26 22:32 编辑

f=open(file_name) 未指定编码格式,改成f=open(file_name, encoding='utf-8'),txt文档的默认编码格式就是'utf-8',打开txt文档,他的右下角就有

jackz007 发表于 2022-11-26 23:12:18

本帖最后由 jackz007 于 2022-11-26 23:15 编辑

import pickle
import os

def save_file(boy , girl , count) :
    fn = 'data_' + str(count) + '.pkl'
    fp = open(fn , 'wb')
    pickle . dump((boy , girl) , fp)
    fp . close()
    fn = 'boy_' + str(count) + '.txt'   
    with open(fn , 'wt') as fp : fp . writelines(boy)
    fn = 'girl_' + str(count) + '.txt'   
    with open(fn , 'wt') as fp : fp . writelines(girl)

def load_file(count) :
    boy , girl = None , None
    fn = 'data_' + str(count) + '.pkl'
    if os . path . exists(fn) and os . path . isfile(fn):
      fp = open(fn , 'rb')
      boy , girl = pickle . load(fp)
      fp . close()
    return boy , girl

def spilt_file(file_name):
    count = 1
    boy = []
    girl = []

    f = open(file_name , encoding = 'UTF-8')                   # 【编码选项】
    for each_line in f:
      if each_line[: 6] != '======':
            (role , line_spoken) = each_line . split(':' , 1)# 【拼写错误】split()
            if role == '小甲鱼':
                boy . append(line_spoken)
            if role == '小客服':
                girl . append(line_spoken)
      else :                                                 # 【缩进错误】
            save_file(boy , girl , count)
            boy = []
            girl = []
            count += 1

    save_file(boy , girl , count)
    f . close()

spilt_file('31.0record.txt')
i = 1
while True :                                                    # 从 pickle 文件加载对象,并进行显示
    a , b = load_file(i)
    if a and b :
      print(' :')
      for x in a : print(x , end = '')
      print()
      print(' :')
      for x in b : print(x , end = '')         
      print()
    else : break
    print()
    i += 1

1207139945 发表于 2022-11-27 16:56:29

jackz007 发表于 2022-11-26 22:30


你好   我的这个问题是解决了   但是运行之后男女各出现了5个文件但是我的原txt中只有一行=号
请问这是啥情况

jackz007 发表于 2022-11-27 17:00:36

1207139945 发表于 2022-11-27 16:56
你好   我的这个问题是解决了   但是运行之后男女各出现了5个文件但是我的原txt中只有一行=号
请问这是 ...

      你是说 'record.txt' 中只有 1 行 '############' ?
      把文件的全部内容都贴出来

Chinese-淼 发表于 2022-11-27 17:14:16

新人报道

1207139945 发表于 2022-11-27 17:46:40

jackz007 发表于 2022-11-27 17:00
你是说 'record.txt' 中只有 1 行 '############' ?
      把文件的全部内容都贴出来

小甲鱼:一二三
小客服:七八九
小甲鱼:七八九
小客服:一二三
===============================================
小甲鱼:二五八
小客服:三六九
小甲鱼:三六九
小客服:二五八

jackz007 发表于 2022-11-27 17:55:53

1207139945 发表于 2022-11-27 17:46
小甲鱼:一二三
小客服:七八九
小甲鱼:七八九


       你得把文件中所有 "小甲鱼:"、"小客服:" 后面的 ":" (中文冒号)改为 ":" (西文冒号),否则,程序无法正常运行,除非,你把我代码 31 行中的 split(":" , 1) 里面的西文冒号也改为中文冒号split(":" , 1) 也行。

1207139945 发表于 2022-11-27 18:00:38

jackz007 发表于 2022-11-27 17:55
你得把文件中所有 "小甲鱼:"、"小客服:" 后面的 ":" (中文冒号)改为 ":" (西文冒号),否 ...

对的   这个我改过了   程序能运行但是生成的文件过多
男女各五个文件{:5_107:}

jackz007 发表于 2022-11-27 18:12:35

1207139945 发表于 2022-11-27 18:00
对的   这个我改过了   程序能运行但是生成的文件过多
男女各五个文件

      世界上没有无缘无故的事情,尤其是写程序,可以断言,你的 'record.txt 中,一定有 4 行,而不是 1 行 '=' 行。

1207139945 发表于 2022-11-27 20:54:45

jackz007 发表于 2022-11-27 18:12
世界上没有无缘无故的事情,尤其是写程序,可以断言,你的 'record.txt 中,一定有 4 行,而不是 1 ...

上面这个就是源文件内容   我就是纳闷一行等号为啥这样分割    难搞

jackz007 发表于 2022-11-27 21:05:46

1207139945 发表于 2022-11-27 20:54
上面这个就是源文件内容   我就是纳闷一行等号为啥这样分割    难搞

         注意我代码的第 36 行,有指出你的代码有缩进错误,如果不改,就会产生很多文件,你肯定没有用我改的版本运行。用你的也可以,重点查一下和我代码 36 行相同的那个 else 的缩进位置。

1207139945 发表于 2022-11-28 18:37:34

jackz007 发表于 2022-11-27 21:05
注意我代码的第 36 行,有指出你的代码有缩进错误,如果不改,就会产生很多文件,你肯定没有用 ...

谢谢啦   就是这个缩进问题被我忽略了
页: [1]
查看完整版本: 小甲鱼老版31讲课后习题