【问题标题】:Unicodedata.normalize : TypeError: normalize() argument 2 must be str, not listUnicodedata.normalize : TypeError: normalize() argument 2 must be str, not list
【发布时间】:2020-03-28 08:49:56
【问题描述】:

我正在尝试在 python 中加载文件。如果您运行以下代码并加载仅包含英文单词的文件,它将正常加载。

Listado.txt 是一个西班牙语文件,其中包含以下单词:abacá, abadí, abadía, abajeño, abaniquería

西班牙语包含重音字母(例如 é)或特殊字符(变音符号),这就是问题所在,当我尝试将此文件加载到 Python 时它会抱怨。我希望能够规范化列表,或删除重音字符并加载列表。

我尝试过使用 :

进行标准化
unicodedata.normalize('NFD', line).encode('ascii', 'ignore')

我收到以下错误:

TypeError: normalize() argument 2 must be str, not list

到目前为止的代码:

import random
import string
import unicodedata

#WORDLIST_FILENAME = "words_alpha.txt"
WORDLIST_FILENAME = "listado.txt"

def loadWords():
    print("Loading word list from file...")
    # inFile: file
    inFile = open(WORDLIST_FILENAME, 'r')
    wordlist =[]
    for line in inFile:
        line = line.split()
        wordlist.extend(line)
#        unicodedata.normalize('NFD', line).encode('ascii', 'ignore')
        print(" "), len(wordlist), ("words loaded.")

    return wordlist

【问题讨论】:

    标签: python python-3.x string list normalization


    【解决方案1】:

    正如错误所说,您正在尝试normalize line,这是一个列表,就像您之前所做的line = line.split() 一样。只需在将其拆分为单词之前对行进行规范化,如下所示:

    for line in inFile:
        unicodedata.normalize('NFD', line).encode('ascii', 'ignore')
        line = line.split()
        wordlist.extend(line)
        print(" "), len(wordlist), ("words loaded.")
    

    或者,如果您想在规范化之前扩展您的单词表,您可以使用列表推导式执行以下操作,以单独规范化每个单词。

    for line in inFile:
        line = line.split()
        wordlist.extend(line)
        line = [unicodedata.normalize('NFD', x).encode('ascii', 'ignore') for x in line]
        print(" "), len(wordlist), ("words loaded.")
    

    【讨论】:

    • 更好的做法可能是不重用变量名。并且有两个单独的变量,每个变量都有一个固定和可预测的类型。变量很便宜,这种错误可能很昂贵。
    猜你喜欢
    • 2019-09-14
    • 1970-01-01
    • 2020-05-29
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2019-12-02
    相关资源
    最近更新 更多