有效地将字符串转换为 python 2.7 的 unicode

Posted

技术标签:

【中文标题】有效地将字符串转换为 python 2.7 的 unicode【英文标题】:Effectively turning strings into unicode for python 2.7 【发布时间】:2016-12-07 16:16:26 【问题描述】:

我正在关注有关 LDA 的教程并遇到问题,因为该教程是在 python 3 中制作的并且我正在使用 2.7(教程声称两者都适用)。据我了解,我需要在 python 2.x 中将字符串转换为 unicode,然后才能应用token.isnumeric()。由于我缺乏经验和知识,我不确定如何在下面的脚本中很好地做到这一点。有人有解决办法吗?

data_dir = 'nipstxt/'
yrs = ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12']
dirs = ['nips' + yr for yr in yrs]
docs = []
for yr_dir in dirs:
files = os.listdir(data_dir + yr_dir)
    for filen in files:
        # Note: ignoring characters that cause encoding errors.
        with open(data_dir + yr_dir + '/' + filen) as fid:
            txt = fid.read()
        docs.append(txt)

tokenizer = RegexpTokenizer(r'\w+')
for idx in range(len(docs)):
    docs[idx] = docs[idx].lower()  # Convert to lowercase.
    docs[idx] = tokenizer.tokenize(docs[idx])  # Split into words.

docs = [[token for token in doc if not token.isnumeric()] for doc in docs]

docs = [[token for token in doc if len(token) > 1] for doc in docs]

【问题讨论】:

【参考方案1】:

将字节字符串转换为 Unicode 字符串的通用方法是使用decode。如果您知道字符串将只包含 ASCII 字符(就像数字一样),您不必指定参数,它将默认为 ascii

docs = [[token for token in doc if not token.decode().isnumeric()] for doc in docs]

如果字符串有可能包含非 ASCII 字符,您可以将其替换为不计为数字的特殊字符。

docs = [[token for token in doc if not token.decode(errors='replace').isnumeric()] for doc in docs]

【讨论】:

谢谢,它似乎在正确的轨道上,因为它给了我一个新错误:UnicodeDecodeError: 'ascii' codec can't decode byte 0xf8 in position 0: ordinal not in range(128)。我想这意味着一些非ascii 字符。我可以设置一个参数来处理这个吗? @WiggyStardust 我已经预料到了这个问题,请参阅我的编辑。

以上是关于有效地将字符串转换为 python 2.7 的 unicode的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中有效地将字符串转换为字节数组(不使用编码)[重复]

如何使用缩放有效地将 16 位无符号短转换为 8 位无符号字符?

在 Python 2.7 中使用 unicodedata.normalize

如何使用非默认 NLS_NUMERIC_CHARACTERS 在 Oracle PL/SQL 中有效地将文本转换为数字?

Python pandas 通过 dt 访问器有效地将日期时间转换为时间戳

如何将字符串中的数字转换为 python 2.7 中的完整函数?