鱼C论坛

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

第28讲读取文件的问题

[复制链接]
发表于 2018-12-20 23:15:00 | 显示全部楼层 |阅读模式

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

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

x
作业中动动手部分要读取一个MP3格式的文件,我按照答案打了,但是读不出来
  1. >>> f = open('OpenMe.mp3')
  2. >>> for each_line in f:
  3.         print(each_line, end='')

  4. Traceback (most recent call last):
  5.   File "<pyshell#220>", line 1, in <module>
  6.     for each_line in f:
  7. UnicodeDecodeError: 'cp932' codec can't decode byte 0xfc in position 361: illegal multibyte sequence
复制代码


我对比了一下上课视频,给encoding参数赋了cp936的值就打出来了,这个该不会就是拓展名的问题吧。。?
  1. >>> f = open("OpenMe.mp3","rt",encoding="cp936")
  2. >>> f
  3. <_io.TextIOWrapper name='OpenMe.mp3' mode='rt' encoding='cp936'>
  4. >>> f.read()
  5. '长期使用Windows操作系统的朋友很容易被扩展名所误导,认为扩展名决定文件类型,其实这种观念是错误的!\n\n其实这就跟一个姓张的坏人,尽管把名字改为了“张好人”,但他还是一个坏人是一个道理的^_^\n\n关于文件的扩展名,初学者容易走进的误区:\n\n误区一:文件扩展名是一个文件的必要构成部分\n\n一个文件可以有或没有扩展名,对于打开文件操作,没有扩展名的文件需要选择程序去打开它,有扩展名的文件会自动用设置好的程序(如有)去尝试打开(是“尝试打开”,而不是“打开”的原因参看下面的第2个误区),文件扩展名是一个常规文件的构成部分,但一个文件并不一定需要一个扩展名。\n\n误区二:文件扩展名表明了该文件是何种类型\n\n文件扩展名可以人为设定,扩展名为TXT的文件有可能是一张图片,同样,扩展名为M-P3的文件,依然可能是一个视频。'
复制代码


另外有办法不用像动动手第一题那样复制出一个新文件,而是直接能修改旧文件后缀名的方法吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-12-20 23:31:02 | 显示全部楼层
加上encoding="cp936"是打开文件的编码格式

至于改后缀的话,最好还是复制一份再改,因为怕误操作,损害原来文件的内容
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-20 23:59:12 | 显示全部楼层
本帖最后由 jackz007 于 2018-12-21 00:00 编辑

      mp3 是二进制文件,保存的是二进制字节,和文本编码、UNICODE 没有任何关系,打开文件时使用 encoding="cp936" 非常的莫名其妙!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 09:32:10 | 显示全部楼层
小甲鱼的MP3文件是在python安装目录下的,可以直接写文件名,你的这个文件可能不在安装目录下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 10:54:52 | 显示全部楼层
朋友,你读取出来的这个文件的内容也是小甲鱼要重点告诉你的学习内容,仔细读读看,感觉你还在把后缀名和编码解码混为一谈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 10:56:51 | 显示全部楼层
wongyusing 发表于 2018-12-20 23:31
加上encoding="cp936"是打开文件的编码格式

至于改后缀的话,最好还是复制一份再改,因为怕误操作,损害 ...

感谢回答,但是为什么不带这个参数就会报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 10:57:55 | 显示全部楼层
jackz007 发表于 2018-12-20 23:59
mp3 是二进制文件,保存的是二进制字节,和文本编码、UNICODE 没有任何关系,打开文件时使用 encodin ...

感谢回答,但是为什么加上这个就能读取了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 10:59:16 | 显示全部楼层
liutingloveliu 发表于 2018-12-21 09:32
小甲鱼的MP3文件是在python安装目录下的,可以直接写文件名,你的这个文件可能不在安装目录下

感谢回答~但应该不是这个问题,因为open这一步并没有报错,我就是在当前目录下执行的,两段代码都是
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-21 11:03:54 | 显示全部楼层
指头比思想慢 发表于 2018-12-21 10:54
朋友,你读取出来的这个文件的内容也是小甲鱼要重点告诉你的学习内容,仔细读读看,感觉你还在把后缀名和编 ...

感谢回答,我知道小甲鱼老师是想告诉我们后缀并不决定文件的本质,那么mp3文件也应该可以直接打印出来,但是照着这个思路运行了答案中的代码却报错了,就是这个矛盾让我困惑
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-21 11:34:15 | 显示全部楼层
卡莲 发表于 2018-12-21 11:03
感谢回答,我知道小甲鱼老师是想告诉我们后缀并不决定文件的本质,那么mp3文件也应该可以直接打印出来, ...

这样,你把我这段代码运行一下就明白了,你光open没有read的问题,你open后打印出来的是一个内存地址,而你需要把这个地址里面的东西读取出来才能在for里面依次打印
  1. data = open(r'OpenMe.mp3')
  2. t = data.read()
  3. print(data)
  4. print(t)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-12-22 10:01:43 | 显示全部楼层
指头比思想慢 发表于 2018-12-21 11:34
这样,你把我这段代码运行一下就明白了,你光open没有read的问题,你open后打印出来的是一个内存地址,而 ...

跑不起来
  1. >>> data = open(r'OpenMe.mp3')

  2. >>> t = data.read()
  3. Traceback (most recent call last):
  4.   File "<pyshell#235>", line 1, in <module>
  5.     t = data.read()
  6. UnicodeDecodeError: 'cp932' codec can't decode byte 0xfc in position 361: illegal multibyte sequence
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-12-23 01:04:33 | 显示全部楼层
卡莲 发表于 2018-12-21 10:57
感谢回答,但是为什么加上这个就能读取了呢?

      “OpenMe.mp3” 的确是个文本文件,不信,你可以用记事本直接打开试试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-6 00:17:03 | 显示全部楼层
本帖最后由 KingFish-v- 于 2019-6-6 00:20 编辑

我也碰到了相同的问题,encoding的参数需要自己修改,楼主自己找出的应该修改的参数是我在寻找的答案。

python对于encoding的解释是
    encoding is the name of the encoding used to decode or encode the
    file. This should only be used in text mode. The default encoding is
    platform dependent, but any encoding supported by Python can be
    passed.  See the codecs module for the list of supported encodings.

platform dependent的话,应该是操作系统之类的问题
如果一个文件全是英文的话就没问题,和后缀名无关。
在我的电脑上,如果新建一个txt文档,把小甲鱼的那个文档存进去,都保存不了,会报错
“This file contains in Unicode format which will be lost if you save this files as an ANSI encoded text file. To keep the Unicode information, click Cancel below and then select one of the Unicode options from the Encoding drop down list. Continue>”
我必须手动转换系统默认的编码模式。而这个文档用Python去读取的话依然会因为encoding=cp950报错,要手动改成cp936才能读取

然后我查找了一下维基
cp950是繁体编码
cp936是简体编码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 17:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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