【问题标题】:How to read the file contents from a file?如何从文件中读取文件内容?
【发布时间】:2012-01-29 13:31:17
【问题描述】:

使用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

【问题讨论】:

    标签: python python-3.x os.walk


    【解决方案1】:

    要读取二进制文件,您必须以二进制模式打开文件。改变

    input = open(fullpath, "r")
    

    input = open(fullpath, "rb")
    

    read() 的结果将是一个 bytes() 对象。

    【讨论】:

    • 谢谢,Lennart - 是的,这就是我需要的秘方。对 Python3 有点陌生!
    • 实际上并不是 Python 3 特有的。在 Python 2 中,二进制文件也应该使用 'b' 标志打开。
    • 是的,回想起来,这一切对我来说似乎有点愚蠢-但这就是我们白痴的学习方式!你可能在想:RTFM!再次感谢您的帮助。
    【解决方案2】:

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

    因此,您有许多取决于您的项目的选项:

    在这种情况下,您可以编辑您的解决方案以简单地捕获 UnicodeDecode 错误并跳过该文件。

    无论您的决定如何,重要的是要注意,如果系统上的文件中存在多种不同的字符编码,则需要指定编码,因为 Python 3.0 将假定字符以 UTF- 8.

    作为参考,关于 Python 3 I/O 的精彩演示:http://www.dabeaz.com/python3io/MasteringIO.pdf

    【讨论】:

    • 感谢您提供此链接以及您的 cmets - 这些对我的学习过程非常有用。至少到目前为止,所有文件似乎都可以作为二进制文件轻松读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-19
    • 2013-03-18
    • 2016-11-02
    • 2017-08-13
    相关资源
    最近更新 更多