Превращение «байтов» в «str»: почему «\» добавляется к «\ n» и тому подобное? - PullRequest
0 голосов
/ 13 февраля 2020

Я читаю различные строки из CSV-файла, например:

f1 = open(current_csv, 'rb')
table = f1.readlines()
f1.close()

Таким образом, любая строка в table выглядит примерно так:

line = b' G\xe4rmanword:           123,45\r\n'

, что type говорит мне, что bytes, но мне нужно обойтись с .replace, поэтому я превращаю его в строку: line = str(line), но теперь line превратился в

"b' G\\xe4rmanword:           123,45\\r\\n'"

с помощью и добавил \ перед каждым \. Однако, с print(line) они не отображаются, но если я хочу превратить \xe4 в ae (альтернативный способ записи ä) с line = line.replace('\xe4', 'ae'), это просто ничего не делает. Использование '\\xe4' работает, однако. Но я ожидал бы, что первый просто превращает \\xe4 в \ae вместо того, чтобы просто ничего не делать, а второй вариант при работе опирается на мое определение нового определения для замены для ä , оба из которых я бы предпочел избегать.

Поэтому я пытаюсь понять, откуда взялся дополнительный backsla sh и как я могу избежать его, чтобы начать с вместо того, чтобы исправить это в моей постобработке. У меня такое ощущение, что что-то изменилось между python2 и 3, так как исходный csv-ридер - это скрипт python2, который я перевел с 2to3.

1 Ответ

3 голосов
/ 13 февраля 2020

Да, поскольку Python3 использует Юникод для всех строк, семантика многих связанных со строками функций, включая str, изменилась по сравнению с Python2. В этом конкретном случае вам нужно использовать второй аргумент для str, предоставляя кодировку, используемую в вводимом вами bytes значении (которое, исходя из использования немецкого языка, равно 'latin1'):

unicode_string = str(line, 'latin1')

В качестве альтернативы вы можете сделать то же самое, используя

unicode_string = line.decode('latin1')

. Возможно, вы захотите удалить \r\n, поэтому добавьте к этому .rstrip(). Кроме того, более элегантное решение для чтения файла:

with open(current_csv, 'rb') as f1:
    table = f1.readlines()

(поэтому нет необходимости в close())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...