【问题标题】:Python 3: dealing with stripping lines in binary modePython 3:以二进制模式处理剥离线
【发布时间】:2012-08-31 13:36:21
【问题描述】:

在 SO 成员的帮助下,我能够达到以下目标,以下是示例代码,目的只是合并来自给文件夹及其子文件夹的文本文件并将输出存储为 master.txt。但我偶尔会得到回溯,看起来在读取文件时会引发错误。

考虑到建议、输入和一些研究,最好用统一的 unicode 清理文本文件或使用一些逐行函数,因此读取每一行应该修剪垃圾字符和空行。

import shutil
import os.path

root = 'C:\\Dropbox\\test\\'
files = [(path,f) for path,_,file_list in os.walk(root) for f in file_list]

with open('C:\\Dropbox\\Python\\master.txt','wb') as output:
    for path, f_name in files:
        with open(os.path.join(path, f_name), 'rb') as input:
            shutil.copyfileobj(input, output)
        output.write(b'\n') # insert extra newline 

with open('master.txt', 'r') as f:
  lines = f.readlines()
with open('master.txt', 'w') as f:
  f.write("".join(L for L in lines if L.strip()))

我得到的回溯:

Traceback (most recent call last):
  File "C:\Dropbox\Python\master1.py", line 14, in <module>
    lines = f.readlines()
  File "C:\PYTHON32\LIB\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 8159: character maps to <undefined>

【问题讨论】:

  • 那么……又是什么问题?
  • @ignacio-vazquez-abrams 什么可以让 Traceback 消失。

标签: python file-io python-3.x traceback python-unicode


【解决方案1】:

您已在文本模式下打开了 master.txt。然后,当您从中 readlines() 时,它将使用系统的默认编码对它们进行解码。显然该文件正在另一个解码中,因为您收到 UnicodeDecodeError。

要么以二进制模式打开文件,要么指定正确的编码。

【讨论】:

  • 10x,我的文本文件本质上很简单,有时我使用复制粘贴,那就是搞砸了。我对编码没有任何偏好。是否有任何快速清理文本文件的方法,以便所有文本文件都具有统一的编码。或者如果可以在阅读该行时进行清理。
  • @user1582596:要获得统一编码,您必须一一更改文件的编码。一种方法是使用 chardet 库 (pypi.python.org/pypi/chardet) 来猜测编码。但在你这样做之前:你确定文件有不同的编码吗?
  • 我在 win7-64 上使用 Notepad++ 创建了这个文件,没有任何明确的编码设置。可能这种差异来自复制粘贴。如果我能从回溯中知道文件引用。也许我可以重新审视并尝试纠正。如您所见,在回溯参考中没有对我的文本文件的参考。就这样,这成为了我的表演终结者。
  • @user1582596:在读取之前打印文件名。简单的。您还需要以文本模式打开文件,而不是使用 copyfileobj(),而是自己读写文件。
  • "print (in_file)" 做了调整,发现两个文本文件的问题并手动纠正。您在最近的帮助上花费了 10 倍的时间。还注意到 _http://python3porting.com 并在网上阅读了非常不错的评论。我是一名思科工程师。但会尝试运行你的书。又是 10 倍。
猜你喜欢
  • 1970-01-01
  • 2014-12-16
  • 2014-05-06
  • 2014-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-05
相关资源
最近更新 更多