1

我需要逐行读取文件。还需要确保正确处理编码。

我写了以下代码:

#!/bin/bash

import codecs

filename = "something.x10"

f = open(filename, 'r')
fEncoded = codecs.getreader("ISO-8859-15")(f)

totalLength = 0
for line in fEncoded:
  totalLength+=len(line)

print("Total Length is "+totalLength)

此代码不适用于所有文件,在某些文件上我得到一个

Traceback (most recent call last):
  File "test.py", line 11, in <module>
    for line in fEncoded:
  File "/usr/lib/python3.2/codecs.py", line 623, in __next__
    line = self.readline()
  File "/usr/lib/python3.2/codecs.py", line 536, in readline
    data = self.read(readsize, firstline=True)
  File "/usr/lib/python3.2/codecs.py", line 480, in read
    data = self.bytebuffer + newdata
TypeError: can't concat bytes to str

我使用的是 python 3.3,脚本必须适用于这个 python 版本。

我做错了什么,我无法找出哪些文件有效,哪些无效,甚至一些普通的 ASCII 文件也失败了。

4

1 回答 1

2

您正在以非二进制模式打开文件。如果您从中读取,您会得到一个根据您的默认编码 ( http://docs.python.org/3/library/functions.html?highlight=open%20builtin#open ) 解码的字符串。

编解码器的 StreamReader 需要一个字节流(http://docs.python.org/3/library/codecs#codecs.StreamReader

所以这应该工作:

import codecs

filename = "something.x10"

f = open(filename, 'rb')
f_decoded = codecs.getreader("ISO-8859-15")(f)

totalLength = 0
for line in f_decoded:
   total_length += len(line)

print("Total Length is "+total_length)

或者您可以使用 encoding 参数open

 f_decoded = open(filename, mode='r', encoding='ISO-8859-15')

阅读器返回解码数据,所以我修复了你的变量名。此外,将pep8视为格式化和编码风格的指南。

于 2013-05-23T12:09:59.917 回答