如何从文件中读取文件内容?

5
使用Python3,希望通过os.walk遍历文件夹中的文件,并将它们读入二进制对象(字符串?),然后对它们进行进一步处理。但是首先,需要知道如何读取os.walk的文件结果。
# NOTE: Execute with python3.2.2

import os
import sys

path = "/home/user/my-files"

count = 0
successcount = 0
errorcount = 0
i = 0

#for directory in dirs
for (root, dirs, files) in os.walk(path):
 # print (path)
 print (dirs)
 #print (files)

 for file in files:

   base, ext = os.path.splitext(file)
   fullpath = os.path.join(root, file)

   # Read the file into binary? --------
   input = open(fullpath, "r")
   content = input.read()
   length = len(content)
   count += 1
   print ("    file: ---->",base," / ",ext," [count:",count,"]",  "[length:",length,"]")
   print ("fullpath: ---->",fullpath)

错误:

Traceback (most recent call last):
  File "myFileReader.py", line 41, in <module>
    content = input.read()
  File "/usr/lib/python3.2/codecs.py", line 300, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xe2 in position 11: invalid continuation byte
2个回答

9
要读取二进制文件,必须以二进制模式打开文件。更改
input = open(fullpath, "r")

to

input = open(fullpath, "rb")

读取操作(read())的结果将会是一个 bytes() 对象。

谢谢,Lennart - 是的,这就是我需要的秘诀。有点不熟悉Python3! - DrLou
实际上,不仅Python 3才需要这样做。在Python 2中,二进制文件也应该使用“b”标志打开。 - Lennart Regebro
1
是啊,在回顾时这一切看起来都有点愚蠢 - 但这就是我们这些笨蛋学习的方式!你可能在想:RTFM!再次感谢您的帮助。 - DrLou

3
由于您的一些文件是二进制的,因此无法成功解码为Python 3用于存储解释器中所有字符串的Unicode字符。请注意,Python 2和Python 3之间的一个重大变化涉及将字符串的表示从ASCII迁移到Unicode字符,这意味着每个字符不能简单地被视为一个字节(是的,在Python 3中,文本字符串需要使用2倍或4倍的内存来存储,因为UTF-8每个字符使用最多4个字节)。
因此,您有许多选项,这将取决于您的项目:
- 忽略二进制文件,通过文件扩展名进行过滤, - 读取二进制文件,如果发生解码异常,则捕获异常并跳过文件,或者使用本主题中描述的方法之一How can I detect if a file is binary (non-text) in python? 在这方面,您可以编辑您的解决方案,只需捕获UnicodeDecode错误并跳过该文件即可。
无论您做出什么决定,重要的是要注意,如果您的系统上的文件有不同的字符编码范围,您需要指定编码,因为Python 3.0将假定字符编码为UTF-8。
作为参考,这里有一份关于Python 3 I/O的精彩演示:http://www.dabeaz.com/python3io/MasteringIO.pdf

感谢您提供这个链接和您的评论 - 这些对我的学习过程非常有用。到目前为止,所有文件似乎都可以轻松地作为二进制文件读取。 - DrLou

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接