Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3001562
  • 博文数量: 167
  • 博客积分: 613
  • 博客等级: 中士
  • 技术积分: 5473
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-13 21:35
个人简介

人, 既无虎狼之爪牙,亦无狮象之力量,却能擒狼缚虎,驯狮猎象,无他,唯智慧耳。

文章分类
文章存档

2015年(19)

2014年(70)

2013年(54)

2012年(14)

2011年(10)

分类: Python/Ruby

2014-07-11 15:34:52

   今天在调试程序的时候突然遇到了问题,之前自己使用Python的文件I/O读写txt文件时没有任何问题,但是在读取doc文件时,却无法正确读写文件内容,比如我们有下面的文件read.doc:

   很简单的一句话,但是在Python中使用解释器打开读取的时候,却无法成功:

点击(此处)折叠或打开

  1. >>> fs = open(r'C:\Users\gyang\Desktop\read.doc', 'r+')
  2. >>> fs.read()
  3. '\xd0\xcf\x11\xe0\xa1\xb1'
  4. >>> fs.read()
  5. '\x00\xff\x00\x00\x04\x00\r\xc6\x08\x00\x029\x10r \x01\x02\x00\x0c\x00CJ\x12\x00OJ\x00\x00QJ\x00\x008\x00 @\x01\x00\x02\x018\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00u\x98'
  6. >>> fs.read()
  7. ''
  8. >>> fs.read()
  9. ''
  10. >>> fs.readline()
  11. ''
  12. >>> fs.readlines()
  13. []
  14. >>> fs.seek(0, 0)
  15. >>> fs.readlines()
  16. ['\xd0\xcf\x11\xe0\xa1\xb1']
  17. >>> fs.readlines()
  18. []
  19. >>> fs.close()
-1. 第一行到第九行,程序先是以文本方式打开文件read.doc,然后使用read()方法读取文件内容,但是却只能读取到前六个字节,而且还是Hex形式;继续运行read()方法,可以再次读取若干字节,直到只能读取''(空字符)为止;
-2. 第十四行到最后,程序重置了文件指针到开头位置,然后使用readlines()方法读取行,但是依旧只能获得前6个字节,然后就返回空列表[];
-3. 那么到底文件时什么样的呢?我们用UltraEdit来看看read.doc:

   可以看到前六个字节确实如程序所显示的,第七个第八个字节为0x1AE1,难道这个是终止符号么?上网去查,也没有找到原因,后续的0xff序列也多有截断,不知道是什么问题,暂时把这个问题记下,如果用二进制来试试看如何呢?

   可以看到,我们得到了全部的字节,默认都是以Hex形式显示,使用二进制读取,能够避免出现上述问题。继续尝试二进制的readlines():

   一共得到了八行数据,每行数据作为字符串列表,末尾以0x00\n结尾,文本形式会对\n进行\r\n的转换,二进制形式则不会。自己猜测出现以上问题的原因在于不同的文件格式添加了未知的文件头和中间部分,使得单一的文本模式读取会发生问题,因此比较通用的处理方法是当处理任意类型文件时,使用二进制文件读取取代文本文件形式,可以避免以上错误。
阅读(11572) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~