Python 处理文本时出现字符编码问题

Python 处理文本时出现字符编码问题,python,encoding,gensim,Python,Encoding,Gensim,我试图处理一个大型语料库,但在preprocess_string()中,它返回一个错误,如下所示 Traceback (most recent call last): File "D:/Projects/docs_handler/data_preprocessing.py", line 60, in <module> for temp in batch(iterator,1000): File "D:/Projects/docs_handler/data_preprocessing.

我试图处理一个大型语料库,但在preprocess_string()中,它返回一个错误,如下所示

Traceback (most recent call last): File "D:/Projects/docs_handler/data_preprocessing.py", line 60, in <module> for temp in batch(iterator,1000): File "D:/Projects/docs_handler/data_preprocessing.py", line 30, in batch for item in iterable: File "D:/Projects/docs_handler/data_preprocessing.py", line 23, in iter_tokenized_documents document = preprocess_string(open(os.path.join(root, file)).read().strip(),filters=CUSTOM_FILTERS) File "C:\Users\koradg\AppData\Local\Programs\Python\Python36\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 0x9d in position 16144: character maps to <undefined>


如何在没有任何错误的情况下运行它?

从您的问题来看,您似乎有编码错误。 只需在打开的文件中使用encoding='utf-8'。 如果该章程不重要,请在打开的文件中使用此errors=“ignore”

Open(os.path.join(root,file))
这是您的问题:如果以文本模式(默认)打开文件而不提供编码(也是默认),Python将使用
sys.getpreferredencoding(False)

这很少是个好主意,但在Windows上尤其糟糕,因为“首选编码”很可能已经完全过时且无用(例如CP850)

因此,要解决您的问题,请根据您的具体需求:

  • 明确提供数据文件的任何编码(如果它们是90年代以后的文本,则可能是UTF8)
  • 以二进制模式打开文件以绕过整个问题(并将
    bytes
    作为输出,而不是
    str
还有一些额外的挑剔:

生成文档(=utf8令牌列表)

  • 没有“utf8标记”这样的东西,也不清楚您指的是utf8代码单元(在这种情况下,您确实希望以二进制模式打开文件)还是代码点(文本模式)
  • 字节和字符串是序列,但它们不完全是列表,这样调用它们是有风险的

  • 如果没有正确的换行符格式,几乎不可能读取错误堆栈,但是,快速看一眼,还不清楚错误中是否包含任何
    gensim
    代码。您应该尝试将代码缩减为触发错误的最小示例,并共享触发错误所需的文件(或文件行)。
    Versions
    Windows-10-10.0.17763-SP0
    Python 3.6.5 (v3.6.5:f59c0932b4, Mar 28 2018, 17:00:18) [MSC v.1900 64 bit (AMD64)]
    NumPy 1.17.0
    SciPy 1.3.0
    gensim 3.8.0
    FAST_VERSION 0
    
    def iter_tokenized_documents(input_directory):
        """Iterate over all documents, yielding a document (=list of utf8 tokens) at a time."""
        for root, dirs, files in os.walk(input_directory):
            for file in filter(lambda file: file.endswith('.txt'), files):
                document = preprocess_string(open(os.path.join(root, file)).read().strip(),filters=CUSTOM_FILTERS)
                if(len(document)):
                    yield document