В чем разница между этими двумя файлами .txt с разделителями табуляции, из-за которой .split(\t) правильно отделяет значения от одного, но не от другого?

У меня есть два отчета о частоте японских слов, которые были составлены из разных источников. Каждая строка содержит слово и количество его вхождений, разделенных символами табуляции. У меня также есть скрипт Python, который должен разбить каждую строку на эти два значения, используя .split("\t"). Последнее значение затем преобразуется в целое число, откуда и возникает ошибка:

ValueError: invalid literal for int() with base 10: '\ufeff29785713'

Это происходит только для данных из второго файла.

После тестирования, чтобы увидеть, будет ли работать преобразование числа в число с плавающей запятой (или изменить ошибку), результат был таким:

ValueError: could not convert string to float: '\ufeff29785713'

Является ли это результатом того, что табуляция или цифры во втором файле, возможно, технически не являются одним и тем же символом и не разграничивают должным образом, вызывая нежелательные символы в последнем значении (или, возможно, вообще не разделяя)? Оба файла имеют кодировку UTF-8.

Укороченная версия первого файла (работает)

Укороченная версия второго файла


person Randall Ivan Carson    schedule 13.08.2020    source источник
comment
Второй файл имеет отметку порядка байтов FEFF в середине потока (после каждой вкладки). Это действительно не имеет смысла   -  person Caius Jard    schedule 13.08.2020
comment
Как я могу удалить его из файла?   -  person Randall Ivan Carson    schedule 13.08.2020
comment
Это не имеет ничего общего с split. split работает отлично, но после разделения на \t в начале строки, которую вы пытаетесь преобразовать в int, появляется дополнительный "\uffef". Символ Юникода U+FEFF — это знак порядка байтов, который используется для обозначения разницы между кодировкой с прямым порядком байтов и кодировкой с прямым порядком байтов.   -  person Pranav Hosangadi    schedule 13.08.2020
comment
Я нашел решение. Мне удалось очистить строку тега, используя .replace(u'\ufeff','').   -  person Randall Ivan Carson    schedule 13.08.2020


Ответы (1)


Честно говоря, совсем не разработчик Python, но, учитывая, что ваш второй элемент массива содержит мошенническую пару символов, вы можете попробовать удалить ее после разделения и до преобразования в число:

x[1] = x[1].replace('\ufeff', '')

x - это имя массива, на который вы разделили свою строку. Операция замены не повлияет на первый файл, потому что FEFF отсутствует.

person Caius Jard    schedule 13.08.2020