Python

Код на программу python пж

Алекс получил от своего друга Никиты из России электронное письмо с вложенным текстовым файлом (не маленьким – точно больше 100Кб) и был удивлен его содержимым. Алекс давно знаком с Никитой и знает, что текст точно на русском языке, что он все пишет в нижнем регистре, и что Никита принципиально не использует никакие кодировки, кроме однобайтовых.
Алекс хотел бы определить, какую кодировку Никита использовал (CP866 (DOS), CP1251 (Windows), KOI8R, ISO-8859-5, cp10007(MacOS)), и увидеть первые 2048 символов этого файла в кодировке UTF-8.

Воспользуйтесь имеющимися данными, напишите программу, которая будет определять автоматически определять кодировку и выводить первые 2048 символов этого файла в кодировке UTF-8. На python пж
https://pastebin.com/eLVQnbd4

Кодировка Mac OS CP10007 не работает на винде, поэтому закомментил. А так надо раскомментить полный список кодировок
Алексей Лавров
Алексей Лавров
55 095
Лучший ответ
По-моему так:
https://pastebin.com/252eUit4

Только я не понял куда надо выводить текст в кодировке utf-8, ведь в консоль по-моему будут крякозябры, поэтому вывел в файл с этой кодировкой.

Тот же код, что и по ссылке, но с риском, что ответ. мэйл. ру его покорежит:
-------------------------------------------------------
"""
Алекс получил от своего друга Никиты из России электронное письмо
с вложенным текстовым файлом (не маленьким – точно больше 100Кб)
и был удивлен его содержимым. Алекс давно знаком с Никитой и знает,
что текст точно на русском языке, что он все пишет в нижнем регистре,
и что Никита принципиально не использует никакие кодировки,
кроме однобайтовых.
Алекс хотел бы определить, какую кодировку Никита использовал
(CP866 (DOS), CP1251 (Windows), KOI8R, ISO-8859-5, cp10007(MacOS)),
и увидеть первые 2048 символов этого файла в кодировке UTF-8.

Воспользуйтесь имеющимися данными, напишите программу, которая будет
определять автоматически определять кодировку
и выводить первые 2048 символов этого файла в кодировке UTF-8.
"""

"""
'cp866' а-п = 0xA0 - 0xAF, р-я = 0xE0 - 0xEF, ё = 0xF1
'koi8-r' а-я = 0xC0 - 0xDF, ё = 0xA3
'iso8859_5' а-я = 0xD0 - 0xEF, ё = 0xF1
'cp1251' а-я = 0xE0 - 0xFF, ё = 0xB8
'mac_cyrillic' а-ю = 0xE0 - 0xFE, ё,я = 0xDE, 0xDF

"""
Dpr = {0:(set(range(0xA0, 0xAF+1)) | set(range(0xE0, 0xEF+1)) | set((0xF1,))),
~~~~~~~~ 1:(set(range(0xC0, 0xDF+1)) | set((0xA3,))),
~~~~~~~~ 2:(set(range(0xD0, 0xEF+1)) | set((0xF1,))),
~~~~~~~~ 3:(set(range(0xE0, 0xFF+1)) | set((0xB8,))),
~~~~~~~~ 4:(set(range(0xE0, 0xFE+1)) | set((0xF1, 0xDF)))}
Dsm = dict.fromkeys(range(5), 0)
Denc = {0:'cp866',
~~~~~~~~1:'koi8-r',
~~~~~~~~2:'iso8859_5',
~~~~~~~~3:'cp1251',
~~~~~~~~4:'mac_cyrillic'}

fn = 'text'
with open(fn + '.txt', 'rb') as f:
~~~~s = f.read(2048)

t = min(2048, len(s))
for i in range(t):
~~~~for d in Dpr:
~~~~~~~~if s[i] in Dpr[d]:
~~~~~~~~~~~~Dsm[d] += 1
enc = Denc[max(Dsm, key=Dsm.get)]
with open(fn + '.txt', encoding=enc) as f:
~~~~s = f.read()

with open('f.txt','w', encoding='utf-8') as fw:
~~~~print(s[:2048], file=fw)

with open('f.txt', encoding='utf-8') as f:
~~~~print(f.read())
Владимир Павлов До меня дошло, что так как я сделал в своем ответе - плохо.

Лучше так
https://pastebin.com/UWN3Pyxp

Просто октрыть файл во всех кодировках и посчитать в каком случае максимально совпадает с алфавитом.

---------
encs = set(['cp866',
~ 'koi8-r',
~ 'iso8859_5',
~ 'cp1251',
~ 'mac_cyrillic'])

abc = set('абвгдеёжзийклмнопрстуфхцчшщъыьэюя')
mx = 0
enc = 'aaa'
for e in encs:
~with open('text.txt', encoding=e) as f:
~~t = 0
~~s = f.read(2048)
~~for a in s:
~~~if a in abc:
~~~~t += 1
~~if mx < t:
~~~mx = t
~~~enc = e

print(enc)
with open('text.txt', encoding=enc) as f:
~s = f.read(2048)

with open('f.txt','w', encoding='utf-8') as fw:
~print(s, file=fw)

with open('f.txt', encoding='utf-8') as f:
~print(f.read())
Привет, можешь мне этот фаил в вк скинуть?
Arsen
Arsen
241