鱼C论坛

 找回密码
 立即注册
查看: 1710|回复: 12

[已解决]作业问题

[复制链接]
发表于 2020-8-13 22:57:35 | 显示全部楼层 |阅读模式

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

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

x
萌新一枚,现在在做从零基础开始学python的29课的作业,我的代码是这么写的:
>>> f = open('/Users/asdfasd/Downloads/record.txt', 'r')
>>> countboy = 1
>>> countgirl = 2
>>> boy = []
>>> girl = []
>>> for each in f:
        if each[:6] != '======':
                (code, record) = each.split(':',1)
                if each[1] =='甲':
                        boy.append(record)
                else:
                        girl.append(record)
        else:
                f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','wb')
                f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','wb')
                f1.close()
                f2.close()
                for each in boy:
                        f1.writeline(each)
                for each in girl:
                        f2.writeline(each)
                boy = []
                girl = []
                countboy += 1
                countgirl += 1

结果它报错:TypeError: a bytes-like object is required, not 'str'
请问这是怎么回事啊?
是不是因为版本改动导致的有些知识点我没有掌握啊,我要去哪里弥补,请各位大佬赐教🙏🙏
顺道问下:感觉小甲鱼没怎么讲一些关于新版本python的只是,有没有大佬有相关学习资源啊,能分享一份到我邮箱咩?
3257565902@qq.com

最佳答案
2020-8-13 23:01:34
for each in f:
        if each[:6] != '======':
                (code, record) = each.split(':',1)
                if each[1] =='甲':
                        boy.append(record)
                else:
                        girl.append(record)
        else:
                f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','w')
                f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','w')
                f1.close()
                f2.close()
                for each in boy:
                        f1.writeline(each)
                for each in girl:
                        f2.writeline(each)
                boy = []
                girl = []
                countboy += 1
                countgirl += 1

本帖被以下淘专辑推荐:

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

使用道具 举报

 楼主| 发表于 2020-8-13 22:59:30 | 显示全部楼层
啊啊,顺道说一下,本人是mac user装的应该是最新版的python 3.8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 23:01:34 | 显示全部楼层    本楼为最佳答案   
for each in f:
        if each[:6] != '======':
                (code, record) = each.split(':',1)
                if each[1] =='甲':
                        boy.append(record)
                else:
                        girl.append(record)
        else:
                f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','w')
                f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','w')
                f1.close()
                f2.close()
                for each in boy:
                        f1.writeline(each)
                for each in girl:
                        f2.writeline(each)
                boy = []
                girl = []
                countboy += 1
                countgirl += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-13 23:01:47 | 显示全部楼层
写入模式应该是文本,而非二进制。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-8-13 23:09:40 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-13 23:01
写入模式应该是文本,而非二进制。

问题是我就算把'wb'改成'w'它仍然会报错,会显示:UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 2: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 23:10:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-13 23:13:31 | 显示全部楼层
我上网查了下,好像原因是因为什么版本的改动开始区分bytes 和 str了,然后我按照百度上的指导把代码改成了:
>>> for each in f:
        each = str(each,encoding = 'utf-8')
        print(each)
        list2 = each.split(':', 1)[1]
        if each[:6] != '======':
                if each[1] =='甲':
                        boy.append(list2)
                else:
                        girl.append(list2)
        else:
                f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','wb')
                f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','wb')
                f1.close()
                f2.close()
                for each in boy:
                        f1.writeline(each)
                for each in girl:
                        f2.writeline(each)
                boy = []
                girl = []
                countboy += 1
                countgirl += 1
结果仍然报错:
       
Traceback (most recent call last):
  File "<pyshell#135>", line 1, in <module>
    for each in f:
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/codecs.py", line 322, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbf in position 2: invalid start byte
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-13 23:14:13 | 显示全部楼层
波澜不惊的内心察觉到了一丝波动,开始理解为什么有人想把版本装回2.7了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 08:52:50 | 显示全部楼层
zhangchi1231231 发表于 2020-8-13 23:14
波澜不惊的内心察觉到了一丝波动,开始理解为什么有人想把版本装 ...

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

使用道具 举报

发表于 2020-8-14 08:54:36 | 显示全部楼层
zhangchi1231231 发表于 2020-8-13 23:14
波澜不惊的内心察觉到了一丝波动,开始理解为什么有人想把版本装 ...
f = open('/Users/asdfasd/Downloads/record.txt', 'r')
countboy = 1
countgirl = 2
boy = []
girl = []
for each in f:
        if each[:6] != '======':
                (code, record) = each.split(':',1)
                if each[1] == '甲':
                        boy.append(record)
                else:
                        girl.append(record)
        else:
                f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','w')
                f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','w')
                f1.close()
                f2.close()
                for each in boy:
                        f1.writeline(each)
                for each in girl:
                        f2.writeline(each)
                boy = []
                girl = []
                countboy += 1
                countgirl += 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 09:23:11 | 显示全部楼层
为什么不把源代码保存为文本文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-14 11:23:29 | 显示全部楼层


你改回 2.x 如果编码还是不一致什么也没用

你将你的 record.txt 文件另存为下,改下编码:

第一步:

                               
登录/注册后可看大图

第二步,改编码 utf-8 即可,记得 代码的 open 全部也加上参数 encoding='utf-8' :

                               
登录/注册后可看大图

或者一般情况改成 ANSI open 里面就可以不带 encoding 参数:

                               
登录/注册后可看大图

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

使用道具 举报

 楼主| 发表于 2020-8-14 12:09:18 | 显示全部楼层
emmmmm
谢谢各位大神,帮助,可是本萌新还是没弄懂:
一,我的文本文档: record.txt 格式本身就是‘utf - 8’ 虽然这个‘utf - 8 ’是啥意思我上网查了查,好像就是一种数据格式
二,我试着用print 没一行的方式发现print出来是这个样子:
         # if each[0][1] == '甲':
                       # boy.append(each[1])
               # else:
                     #   girl.append(each[1])
      #  else:
              #  f1 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) +'.txt','w')
             #   f2 = open('/Users/asdfasd/Downloads' + 'boy_' + str(countboy) + '.txt','w')
             #   f1.close()
             #   f2.close()
             #   for each in boy:
             #           f1.writeline(each)
             #   for each in girl:
              #          f2.writeline(each)
             #   boy = []
              #  girl = []
               # countboy += 1

               
['{\\rtf1\\ansi\\ansicpg936\\cocoartf1671\\cocoasubrtf600\n']
['{\\fonttbl\\f0\\fnil\\fcharset134 PingFangSC-Regular;\\f1\\fswiss\\fcharset0 Helvetica;}\n']
['{\\colortbl;\\red255\\green255\\blue255;}\n']
['{\\*\\expandedcolortbl;;}\n']
['\\paperw11900\\paperh16840\\margl1440\\margr1440\\vieww10800\\viewh8400\\viewkind0\n']
['\\pard\\tx566\\tx1133\\tx1700\\tx2267\\tx2834\\tx3401\\tx3968\\tx4535\\tx5102\\tx5669\\tx6236\\tx6803\\pardirnatural\\partightenfactor0\n']
['\n']
["\\f0\\fs24 \\cf0 \\'d0\\'a1\\'bf\\'cd\\'b7\\'fe\n"]
['\\f1 ', '\n']
["\\f0 \\'d0\\'a1\\'bc\\'d7\\'d3\\'e3\\'a3\\'ac\\'bd\\'f1\\'cc\\'ec\\'d3\\'d0\\'bf\\'cd\\'bb\\'a7\\'ce\\'ca\\'c4\\'e3\\'d3\\'d0\\'c3\\'bb\\'d3\\'d0\\'c5\\'ae\\'c5\\'f3\\'d3\\'d1\\'a3\\'bf\n"]
['\\f1 \\\n']
['\n']
["\\f0 \\'d0\\'a1\\'bc\\'d7\\'d3\\'e3\n"]
['\\f1 ', '\n']
["\\f0 \\'df\\'d7\\'a3\\'bf\\'a3\\'bf\n"]
所以我猜想是不是就是这种格式导致了 error 但是打'.txt' 文本文档后发现显示的却是正常的汉子,萌新疑惑了,有大佬可以解释下咩,还有我应该在python里怎么处理才能把这种 utf-8 的bytes转化成 str啊?


萌新刚开始学,有些地方可能没表述到位,希望各位大佬谅解一下
python wenti utf-8.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 19:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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