2016-10-12 4 views
1

Итак, у меня есть эти нечестивые мерзости программы:Weird UTF-8 один лайнер переводчик ошибка

print((lambda raw, name_file: ((lambda start_time, total, lines, names: ((lambda parsed: ('\n'.join(str(10*(parsed[0][name]+parsed[1][name]/2)/total).ljust(6) + name for name in names)))(list(map(lambda x: __import__("collections").Counter(x), map(lambda x: list(map(lambda x: x[1], x)), [list(group[1]) for group in __import__("itertools").groupby(sorted([list(group[1])[0] for group in __import__("itertools").groupby(sorted(list(map(lambda x: [x[3], ' '.join([x[4], x[5], x[6]]), __import__("datetime").datetime.strptime(x[0] + ' ' + x[1], '%Y.%m.%d %H:%M:%S')], map(str.split, filter(lambda x: (any(name.strip() in x for name in names) and "OK (0)" in x), lines))))), lambda x: (x[0], x[1]))], key = lambda x: (x[2], x[1], x[0])), lambda x: ((x[2] < start_time+__import__("datetime").timedelta(days=7)) + (x[2] < start_time+__import__("datetime").timedelta(days=14))))]))))))(__import__("datetime").datetime.strptime(raw.readline().strip(), '%d.%m.%Y %H:%M'), int(raw.readline()), map(lambda x: x.replace("Минчен", ""), raw.readlines()), list(map(str.strip, name_file.readlines())))))(raw = open("test.txt", "r"), name_file = open("names.txt", "r"))) 

(вероятно, лучше на pastebin)

Она почти работают, но так, как это не Работа очень странная и выглядит как ошибка интерпретатора для меня.

Теперь единственные символы, отличные от ASCII в коде, находятся в строке «Минчен» в конце, и даже тогда они отлично совместимы с UTF-8, которая должна быть кодировкой по умолчанию. Теперь проблема заключается в том, что Python выбрасывает эту ошибку:

Non-UTF-8 code starting with '\xd1' in file lulz.py on line 1, but no encoding declared; 

И это не просто какая-то странная проблема с кодировкой! Если я удалю последний «н» в строке, программа будет работать нормально; в тот момент, когда я добавляю любой Русское письмо в его месте, сбой переводчика. Даже если я добавлю только одну строку до этого места, где бы то ни было, так, чтобы эта строка находилась во второй строке исходного кода, интерпретатор не сбой.

Конечно, я не могу представить пример, учитывая, насколько это неудобно и неустойчиво, но я уверен, что это не ожидаемое поведение. Это ошибка в интерпретаторе или я что-то не так?

Кстати, для этого может потребоваться «names.txt» и «test.txt»; если вы хотите протестировать, вы можете создать два пустых файла с этими именами.

UPD Даже добавив пробел после какого-либо одного ( делает все работает! Здесь что-то не так.

UPD2 Я использую Python 3.5.1

>>> python3 --version Python 3.5.1

UPD3 вот мой file.

UPD4 и здесь является шестнадцатеричного: http://pastebin.com/5R1rbtc3

UPD5, очевидно, эта проблема может быть воспроизведена только на Mac. Я чувствую, что другое поведение на разных платформах не предназначено.

+0

Можете ли вы воспроизвести это с кодом, который не похож на Lisp? – chepner

+0

@chepner вот в чем проблема --- почти любое изменение ломает ошибку! Я пытаюсь, но я не уверен, что могу – Akiiino

+0

С файлом, загруженным из dropmefile: используя Python 3.4.4, скрипт жалуется, что test.txt не найден. используя Python 2, он жалуется на кодирование, добавляя его в объявление «кодирование», заставляя его жаловаться на не найденный test.txt. – Tryph

ответ

1

Ошибка в ожидании того, что такое кодировка исходного файла по умолчанию. Это только UTF-8, когда вы используете Python 3.x (я проверил, 3.5 анализирует мерзость без проблем)

Python 2.x по умолчанию ASCII, поэтому добавьте комментарий к кодировке в качестве первой строки в этой мерзости и вы хорошо идти

# -*- coding: utf8 -*- 
+0

'- * -' не нужны – Tryph

+0

И, как указывает тег «python-3.x», я действительно использую python 3.5. Кроме того, если бы я использовал python 2, программа не работала бы вообще, не только в некоторых случаях – Akiiino

+0

* shrug *, тогда я не знаю, что вы делаете неправильно, я скачал (! Не скопировал-вставить!) файл и запускал его напрямую с помощью python 3.5, никаких ошибок. Это должно быть вашим редактором, потому что вы говорите, что редактирование только одного места делает его неисправным. Я отредактировал файл с возвышенным текстом 3, чтобы вставить строку кодирования, и он отлично работал в python 2.x. –

0

персонажи сами по себе не имеют кодировку - это не имеет смысла говорить, персонаж UTF-8. UTF-8 является одним из многих кодировок, которые могут использоваться для представления символа. В вашей программе есть символы, отличные от ASCII, и на основе ошибки исходный файл сохраняется в кодировке, отличной от UTF-8.Поскольку кодировка не-UTF-8 не объявлена ​​в исходном файле, Python не знает, какую кодировку использовать вместо UTF-8, что приведет к ошибке. Лучшим решением было бы сообщить вашему редактору сохранить файл с использованием UTF-8, но, очевидно, процесс для этого будет специфичным для вашего редактора.

+0

И как именно изменение длины моей строки_ повлияет на кодировку, в которой сохранен файл? Нет, я уверен, что файл сохраняется в UTF-8 – Akiiino

+0

BTW, используя метод iconv, упомянутый в этом ответе http://stackoverflow.com/a/11021413/3713926, я получаю, что файл определенно действителен UTF -8 – Akiiino

+0

Я ответил, насколько мог, с предоставленной вами информацией. Не имея исходного файла, я не могу определить, находится ли проблема в исходном файле или в Python. –

Смежные вопросы