2011-12-28 97 views
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 

回答

9

要读你必须以二进制方式打开文件的二进制文件。改变

input = open(fullpath, "r") 

input = open(fullpath, "rb") 

读(的结果)将是一个字节()对象。

+0

韩国社交协会,伦纳特 - 是的,这是秘密武器,我需要。有点新的Python3! – DrLou 2011-12-29 17:03:29

+0

这实际上并不是Python的3特定。二进制文件也应该在Python 2中用'b'标志打开。 – 2011-12-29 20:20:45

+1

是啊,回想起来,这一切似乎有点愚蠢 - 但这就是我们白痴学习的方式!你可能会想:RTFM!再次感谢您的帮助。 – DrLou 2014-11-03 21:17:34

3

由于您的某些文件是二进制文件,因此无法将其成功解码为Python 3用于在解释器中存储所有字符串的Unicode字符。请注意,Python 2和Python 3之间的巨大变化涉及将字符串表示从ASCII转换为unicode字符,这意味着每个字符不能简单地视为一个字节(是的,Python 3中的文本字符串需要2x 或4x尽可能多地存储与Python 2一样的内存,因为UTF-8每个字符最多使用4个字节)。

您这样有很多的选择,将取决于您的项目:

说明在这方面的方法之一,您可以编辑您的解决方案简单地赶上UnicodeDecode错误,跳过文件。

无论您的决定如何,请注意,如果系统中的文件中存在大量不同的字符编码,则需要指定编码,因为Python 3.0将假定字符以UTF编码-8。

作为参考,在Python 3的I/O一个伟大的演讲:http://www.dabeaz.com/python3io/MasteringIO.pdf

+0

感谢您的链接和您的意见 - 这些对我的学习过程非常有用。到目前为止,至少,所有的文件都像二进制文件一样易于阅读。 – DrLou 2011-12-29 17:07:20