Python:tracebackcodecs.charmap\u decode(输入,self.errors,decoding\u表)[0]

Python:tracebackcodecs.charmap\u decode(输入,self.errors,decoding\u表)[0],python,file-io,python-3.x,traceback,python-unicode,Python,File Io,Python 3.x,Traceback,Python Unicode,下面是示例代码,目的只是合并给定文件夹及其子文件夹中的文本文件。我偶尔会得到回溯,所以不知道去哪里找。还需要一些帮助来增强代码,以防止合并空行&在合并/主文件中不显示任何行。在合并文件之前,最好进行一些清理,或者在合并过程中忽略空行 文件夹中的文本文件不超过1000行,但聚合主文件可以很容易地跨越10000多行 import os root = 'C:\\Dropbox\\ans7i\\' files = [(path,f) for path,_,file_list in os.walk(roo

下面是示例代码,目的只是合并给定文件夹及其子文件夹中的文本文件。我偶尔会得到回溯,所以不知道去哪里找。还需要一些帮助来增强代码,以防止合并空行&在合并/主文件中不显示任何行。在合并文件之前,最好进行一些清理,或者在合并过程中忽略空行

文件夹中的文本文件不超过1000行,但聚合主文件可以很容易地跨越10000多行

import os
root = 'C:\\Dropbox\\ans7i\\'
files = [(path,f) for path,_,file_list in os.walk(root) for f in file_list]
out_file = open('C:\\Dropbox\\Python\\master.txt','w')
for path,f_name in files:
    in_file = open('%s/%s'%(path,f_name), 'r')

    # write out root/path/to/file (space) file_contents
    for line in in_file:
        out_file.write('%s/%s %s'%(path,f_name,line))
    in_file.close()

    # enter new line after each file
    out_file.write('\n')

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\master.py", line 9, in <module> for line in in_file:
  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 972: character maps to <undefined>  
导入操作系统
root='C:\\Dropbox\\ans7i\'
files=[(path,f)表示路径,u,os中的文件列表。walk(root)表示文件列表中的f]
out\u file=open('C:\\Dropbox\\Python\\master.txt','w')
对于路径,文件中的f_名称:
在文件中=打开(“%s/%s%”(路径,f\u名称),“r”)
#写出根/路径/到/文件(空间)文件内容
对于\u文件中的行:
out\u file.write(“%s/%s%s%”(路径、f\u名称、行))
in_file.close()中
#在每个文件后输入新行
out\u file.write('\n')
以open('master.txt','r')作为f:
行=f.读行()
以open('master.txt','w')作为f:
f、 写入(“.”join(如果L.strip(),则L代表L的行)
回溯(最近一次呼叫最后一次):
文件“C:\Dropbox\Python\master.py”,第9行,对于\u文件中的第9行:
文件“C:\PYTHON32\LIB\encodings\cp1252.py”,第23行,在decode-return-codecs.charmap\u decode(输入,self.errors,decoding\u表)[0]
UnicodeDecodeError:“charmap”编解码器无法解码位置972:字符映射到的字节0x81

抛出错误是因为Python 3使用与内容不匹配的默认编码打开文件

如果您所做的只是复制文件内容,那么最好同时使用和以二进制模式打开文件。这样就完全避免了编码问题(当然,只要您的所有源文件都是相同的编码,这样您就不会得到混合编码的目标文件):

我对代码进行了一些清理,以使用上下文管理器(这样在完成后文件会自动关闭),并使用
os.path
为文件创建完整路径

如果确实需要逐行处理输入,则需要告诉Python所需的编码,以便它可以将文件内容解码为Python字符串对象:

open(path, mode, encoding='UTF8')
请注意,这要求您预先知道文件使用什么编码


如果您对Python3、文件和编码有进一步的疑问,请阅读。

对于in_文件中的line in,错误是否真的发生在
中?我想是在那之后,但不是很确定。你能测试一下Python是否在循环中运行吗?@Fabian:就是这一行,回溯很清楚。读取文件时会抛出一个错误。@MartijnPieters但是UnicodeDecodeError?奇怪。@Fabian:一点也不奇怪,python 3会自动解码文本文件。@MartijnPieters啊,python 3。好吧。我的测试文件本质上非常基本,但有时会有粘贴的内容,看起来这是在制造问题。只是厌倦了上面的第一个代码,现在得到一些精确的错误,它说TypeError:invalid file:并试图指出文件。但奇怪的是,这只是一个空白文件。@user1582596:你能用pastie.org向我显示回溯吗?@user1582596:这是我更改下面的代码,你可以读取主文件中的所有行来删除它们。您仍然需要找出这些代码的编码,或者设计一种在二进制模式下读写的方法,在这种模式下删除换行符周围的所有空白。另请参见我回答的第二部分。在二进制模式下处理剥离行可能是关于堆栈溢出的一个有趣的新问题。@user1582596:您可以通过循环所有文件名,打印文件名,然后在文本模式下打开文件(
open(filename,'r'))
,在文件上循环读取所有行,直到得到异常。最后打印的文件名是您的问题文件。
open(path, mode, encoding='UTF8')