Избавиться от десятичного символа Юникод - PullRequest
0 голосов
/ 03 июня 2019

У меня есть огромный файл, который выглядит следующим образом:

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

Поскольку вы можете видеть, что файл содержит некоторые десятичные числа в Юникоде, я хотел бы заменить все их латинскими буквами перед использованием файла.Даже открывая его с помощью кодировки 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 ]

3 голосов
/ 03 июня 2019

@ PanagiotisKanavos правильно предположил, что html.unescape смог заменить ссылку на символ xml на символ Юникода.Сложность в том, что некоторые ссылки правильно заканчиваются точкой с запятой (;), а другие нет.И в этом последнем случае, если одна сущность, за которой следует точка с запятой разделитель , разделитель будет съеден преобразованием, сдвинув следующие поля.

Таким образом, единственный надежный способ - это:

  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 голос
/ 03 июня 2019

Этот текст не является UTF8 или Unicode в целом. Это HTML-кодированный текст , скорее всего, вьетнамский. Эти escape-последовательности соответствуют вьетнамским символам, например &#432 is ư - на самом деле, я просто набрал последовательность редактирования в поле редактирования SO, и появился правильный символ. ớ - это ớ.

Копирование всего текста вне блока кода приводит к

6814; gymnocéphale; 185; 151; 49

6815; gymnodonte; 83; 330; 0

6816; gymnosome; 287; 105; 42

6817; га; 69; 305; 0

6818; hải â; 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; ч & # 7893mang; 54; 298; 0 * * тысяча двадцать-семь * 1 028 * 6851; holobranche; 97; 329; 0

6852; hoplopode; 65; 296; 0

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

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

6855; hyalosome; 73; 371; 0 * +1037 *

6883; jumarre; 83; 295; 0

6884; КЭК; 86; 326; 0

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

* * 6886 тысячи сорок четыре; Хоанг; 64; 323; 0

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

Поиск в Google для Họ Khướu возвращает эта страница в Википедии о Họ Khướu .

Я думаю, можно предположить, что это вьетнамский текст в кодировке HTML. Чтобы преобразовать его в Unicode, вы можете использовать html.unescape :

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

UPDATE

Приведенный выше текст - это просто оригинальный текст с дополнительной новой строкой на странице. Это средство рендеринга уценки SO, которое преобразует escape-последовательности в соответствующие глифы.

Самое смешное, что эта строка:

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

Не может быть отображено, потому что объекты HTML не завершены должным образом. html.unescape с другой стороны будет преобразовывать символы. Ясно, что html.unescape гораздо более простителен, чем средство визуализации уценки SO.

Любая из этих строк:

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
0 голосов
/ 03 июня 2019

Сначала восстановите файл, прежде чем загружать его в анализатор CSV.

Предполагая, что Мартен в комментариях прав, измените кодировку:

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

Затем замените escape-символы соответствующими символами.

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
...