Найти - Пользователи
Полная версия: Помогите с кодировкой. Сломал голову
Начало » Python для новичков » Помогите с кодировкой. Сломал голову
1
alex77bel
Здравствуйте! Не могу победить проблему с кодировкой.
Читаю данные с хед хантера, пишу их в файл. Все хорошо. Когда пытаюсь принтануть - получаю трейсбэк:

данные сохранены
Traceback (most recent call last):
File “D:\py_projects\job-parsing-k4\src\tmp.py”, line 25, in <module>
print(res)
File “C:\python 3.11.2\Lib\encodings\cp1251.py”, line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: ‘charmap’ codec can't encode character ‘\u0138’ in position 147082: character maps to <undefined>

Process finished with exit code 1


Собственно, сам код.
 import requests
import json
FileName = 'test.json'
def get_data():
    params = {'area': 113, 'currency': 'RUR', 'page': 0, 'per_page': 100, 'only_with_salary': True,
              'search_field': 'name', 'text': 'python', 'salary': 200000}
    req = requests.get('https://api.hh.ru/vacancies', params)
    data = req.content.decode('utf-8')
    req.close()
    return data
def json_load():
    with open(FileName, encoding='utf-8') as f:
        j = json.load(f)
    return j
jsObj = json.loads(get_data())
with open(FileName, 'w', encoding='utf-8') as f:
    f.write(json.dumps(jsObj, ensure_ascii=False, indent=2))
print('данные сохранены')
res = json_load()
print(res)

Путем мучений выяснил, что ошибка возникает из-за строки
“Понимание ĸаĸ работает асинхронность в <highlighttext>python</highlighttext> и знаĸомство с asyncio. Опыт работы с микросервисной архитектурой. Опыт работы с FastAPI. ”,
а конкретно, из-за букв “ĸ” в словах “ĸаĸ” и “знаĸомство”, потому что это странные буквы с кодом ‘\u0138’, который дает ошибку.

Помогите, как сделать, чтобы в файле лежали только нормальные данные, которые не будут давать ошибку в принте?
py.user.next
alex77bel
а конкретно, из-за букв “ĸ” в словах “ĸаĸ” и “знаĸомство”, потому что это странные буквы с кодом ‘\u0138’, который дает ошибку.
wiki. буква кра

Ты просто перед сохранением в файл замени все эти юникод-последовательности через str.replace() с буквы кра на букву к.

Сделай переменную textout = json.dumps(…) и в ней меняй букву.
alex77bel
там же могут и другие сюрпризы быть подошли кодировки cp866 и ISO-8859-5 в формате
print(i.encode(encoding=“cp866”, errors=“replace”).decode(encoding=“cp866”))
py.user.next
И что, это похоже на букву к?
  
>>> text = 'abc \u0138 def'
>>> 
>>> text.encode(encoding='cp866', errors='replace').decode(encoding='cp866')
'abc ? def'
>>>

Я тебе говорю вот об этом
  
>>> text = 'abc \u0138 def'
>>> 
>>> textout = text.replace('\u0138', 'к')
>>> textout.encode(encoding='cp866', errors='replace').decode(encoding='cp866')
'abc к def'
>>>

alex77bel
там же могут и другие сюрпризы быть
Это вручную проставлено. И твоя задача - это всё обратить. Дебилоидов много в сети.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB