摆脱Unicode十进制字符

时间:2019-06-03 09:18:53

标签: python unicode tuples python-3.6 python-unicode

我有一个很大的文件,看起来像这样:

6814;gymnocéphale;185;151;49
6815;gymnodonte;83;330;0
6816;gymnosome;287;105;42
6817;hà mã;69;305;0
6818;hải âu;81;294;0
6819;hải cẩu;64;338;0
6820;hải yến;62;269;0
6848;histiophore;57;262;0
6849;hiverneur;56;248;0
6850;h&#7893mang;54;298;0
6851;holobranche;97;329;0
6852;hoplopode;65;296;0
6853;h&#432&#417u cao cổ152;298;0
6854;huy&#7873n đề62;324;0
6855;hyalosome;73;371;0
6883;jumarre;83;295;0
6884;kéc;86;326;0
6885;kền kền;73;303;0
6886;khoang;64;323;0
6887;khướu;62;325;0

如您所见,该文件包含一些unicode十进制,在使用该文件之前,我想用它们的拉丁字符替换它们。即使使用utf-8编码将其打开,也无法消除错误。

您知道一种方法吗?我想创建一个字典并检索索引2处的数字。

for  : 6883;jumarre;83;295;0;   => i have 83
for : 6887;khướu;62;325;0   => i have &#7899 => which is false , i should have 62
with codecs.open('JeuxdeMotsPolarise_test.txt', 'r', 'utf-8', errors = 'ignore') as text_file:
    text_file =(text_file.read())
    #print(text_file)

dico_lexique =  ({i.split(";")[1]:i.split(";")[2:]for i in text_file.split("\n") if i})

这是尝试@serge命题所得到的结果,但在行之间留有空白。


6814;gymnocéphale;185;151;49

6815;gymnodonte;83;330;0

6816;gymnosome;287;105;42

6817;hà mã;69;305;0

6818;hi âu;81;294;0

6819;hi cu;64;338;0

6820;hi yn;62;269;0

6848;histiophore;57;262;0

6849;hiverneur;56;248;0

6850;h mang;54;298;0

6851;holobranche;97;329;0

6852;hoplopode;65;296;0

6853;hu cao c;152;298;0

6854;huyn ;62;324;0

6855;hyalosome;73;371;0

6883;jumarre;83;295;0

6884;kéc;86;326;0

6885;kn kn;73;303;0

6886;khoang;64;323;0

6887;khu;62;325;0


编辑:我重新下载了原始文件,并且缺少“;”错误已纠正。

例如:

=> 6850;hổmang; 54; 298; 0(这就是现在更新文件中的样子)

谢谢大家

3 个答案:

答案 0 :(得分:3)

@PanagiotisKanavos正确地猜测html.unescape能够用其unicode字符替换xml char引用。困难的部分是,某些ref正确地以其终止分号(;)结尾,而另一些则没有。在后一种情况下,如果一个实体后跟一个分号分隔符,则分隔符将被转换吃掉,并转移以下字段。

所以唯一可靠的方法是:

  1. 使用;分隔符将文件作为CSV文件逐行处理
  2. 最终从第二个开始到第四个结束的中间字段的结尾
  3. 使中间字段不存在

如果要转换文件,可以执行以下操作:

with open('file.csv') as fd, open('fixed.csv', 'w', newline='') as fdout:
    rd = csv.reader(fd, delimiter=';')
    wr = csv.writer(fdout, delimiter=';')
    for row in rd:
        if len(row)> 5:
            row[1] = ';'.join(row[1:len(row)-3])
            del row[2:len(row)-3]
        row[1] = html.unescape(row[1])
        wr.writerow(row)

如果您只想构建从字段0到字段2的映射:

values = {}
with open('file.csv') as fd:
    rd = csv.reader(fd, delimiter=';')
    for row in rd:
        values[field[0]] = field[-3]

答案 1 :(得分:1)

此文本通常不是UTF8或Unicode。是HTML-encoded text,很可能是越南语。这些转义序列对应于越南语字符,例如&#432是ư-实际上,我只是在SO编辑框中键入了编辑序列,然后出现了正确的字符。 ớ是ớ。

将整个文本复制到代码块之外会产生

6814;gymnocéphale; 185; 151; 49

6815; gymnodonte; 83; 330; 0

6816; gymnosome; 287; 105; 42

6817;hàmã; 69; 305; 0

6818;hảiâu; 81; 294; 0

6819;hảicẩu; 64; 338; 0

6820;hảiyến; 62; 269; 0

6848; histiophore; 57; 262; 0

6849; hiverneur; 56; 248; 0

6850; h&#7893mang; 54; 298; 0

6851; holobranche; 97; 329; 0

6852; hoplopode; 65; 296; 0

6853; h&#432&#417u caocổ152; 298; 0

6854; huy&#7873nđề62; 324; 0

6855;透明质酸; 73; 371; 0

6883; jumarre; 83; 295; 0

6884;kéc; 86; 326; 0

6885;kềnkền; 73; 303; 0

6886; khoang; 64; 323; 0

6887;khướu; 62; 325; 0

搜索HọKhướu会返回this Wikipedia page about Họ Khướu

我认为这是HTML编码的越南文字是安全的。要将其转换为Unicode,可以使用html.unescape

import html
line='6887;khướu;62;325;0'
properLine=html.unescape(line)

更新

上面发布的文本仅是原始文本,每页额外有一个换行符。是SO的markdown渲染器,将转义序列转换为相应的字形。

有趣的是,这一行:

6853;h&#432&#417u cao cổ152;298;0

由于HTML实体未正确终止,因此无法呈现。另一方面,html.unescape 转换字符。显然,html.unescape比SO的markdown渲染器宽容得多。

以下任一行:

html.unescape('6853;hươu cao cổ152;298;0')
html.unescape('6853;h&#432&#417u cao cổ152;298;0')

返回:

6853;h\u01b0\u01a1u cao c\u1ed5152;298;0

答案 2 :(得分:0)

先将文件修复,然后再将其加载到CSV分析器中。

假设评论中的Maarten是正确的,请更改编码:

iconv -f cp1252 -t utf-8 < JeuxdeMotsPolarise_test.txt > JeuxdeMotsPolarise_test.utf8.txt

然后用适当的字符替换转义符。

perl -C -i -lpe'
    s/&#([0-9]+);?/chr $1/eg;       # replace entities
    s/;?(\d+;\d+;\d+)$/;$1/;        # put back semicolon
                                    # if it was consumed accidentally
' JeuxdeMotsPolarise_test.utf8.txt

运行替换后的JeuxdeMotsPolarise_test.utf8.txt的内容:

6814;gymnocéphale;185;151;49
6815;gymnodonte;83;330;0
6816;gymnosome;287;105;42
6817;hà mã;69;305;0
6818;hải âu;81;294;0
6819;hải cẩu;64;338;0
6820;hải yến;62;269;0
6848;histiophore;57;262;0
6849;hiverneur;56;248;0
6850;hổmang;54;298;0
6851;holobranche;97;329;0
6852;hoplopode;65;296;0
6853;hươu cao cổ;152;298;0
6854;huyền đề;62;324;0
6855;hyalosome;73;371;0
6883;jumarre;83;295;0
6884;kéc;86;326;0
6885;kền kền;73;303;0
6886;khoang;64;323;0
6887;khướu;62;325;0