2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Python. Проблема с кириллицей при записи в файл
Сообщение25.07.2022, 12:43 


27/09/19
189
Добрый день! При записи в файл возникли проблемы с кодировкой. Вместо кириллицы появляется текст вида Крестьянин

Прежде чем спрашивать, а тщательно искал информацию в гугле. Максимально похоже на то, что должно работать - вот это

Используется синтаксис Python
text = 'Крестьянин'
print(text.encode('cp1251').decode('utf-8'))


Но и это не работает у меня, к сожалению. Сможете подсказать, пожалуйста, как правильно погуглить (возможно я не тот запрос пишу) или что можно предпринять, чтобы получалось кириллицу записывать в файл?

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение25.07.2022, 13:24 
Заслуженный участник
Аватара пользователя


16/07/14
8818
Цюрих
Какой python - второй или третий? В них работа с юникодом отличается довольно сильно.
Особо царских путей тут нет, советую прочитать документацию https://docs.python.org/3/howto/unicode.html

Ваша строка получается следующим образом: берем строку "Крестьянин", записываем её в UTF8. Получившуюся байтовую последовательность интерпретируем как строку в кодировке CP1251 и конвертируем в UTF8. Т.е. если вы это видите в файле - то скорее всего то, чем вы открываете файл, считает, что в файле CP1251 и конвертирет его в UTF8 для показа.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение25.07.2022, 14:52 


27/09/19
189
mihaild в сообщении #1561008 писал(а):
Какой python - второй или третий? В них работа с юникодом отличается довольно сильно.
Особо царских путей тут нет, советую прочитать документацию https://docs.python.org/3/howto/unicode.html

Ваша строка получается следующим образом: берем строку "Крестьянин", записываем её в UTF8. Получившуюся байтовую последовательность интерпретируем как строку в кодировке CP1251 и конвертируем в UTF8. Т.е. если вы это видите в файле - то скорее всего то, чем вы открываете файл, считает, что в файле CP1251 и конвертирет его в UTF8 для показа.


Спасибо за информацию. У меня 3 версия питона. После вот этих строк

Используется синтаксис Python
text = 'Крестьянин'
print(text.encode('cp1251').decode('utf-8'))


у меня вообще перестало что-то записываться в файл) Просто ничего не записывается, но программа работает)

-- 25.07.2022, 14:57 --

Документация, честно говоря, идет тяжеловато)

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение25.07.2022, 15:51 


09/05/16
138
Где именно появляется Крестьянин? Может быть, Вам нужно просто открывать файл в кодировке UTF-8, а не CP-1251? (Я не исключаю, что Вы уже открываете файл как UTF-8, но в него был записан результат текст.encode('utf-8').decode('cp1251').encode('utf-8'), что усложняет расшифровку, но начать стоит с простого решения.)

Как именно Вы записываете текст в файл? Что показывает print(ascii(этот_текст)), прежде чем Вы его запишете? Как именно (в частности, с какой кодировкой) Вы открываете файл, чтобы записать в него эти данные?

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение25.07.2022, 21:18 
Заслуженный участник
Аватара пользователя


16/07/14
8818
Цюрих
kot-obormot в сообщении #1561020 писал(а):
у меня вообще перестало что-то записываться в файл
Подробнее. Что наблюдалось раньше, что вы сделали, что наблюдается теперь, наблюдение чего вы ожидаете?

Ну и да - как вы пишете в файл, как вы проверяете, что в нём?
kot-obormot в сообщении #1561020 писал(а):
Документация, честно говоря, идет тяжеловато)
Если хотите научиться программировать, а не просто перебирать комбинировать ответы со stackoverflow в надежде, что результат будет работать достаточно часто - придется научиться работать с документацией. Тем более что у питона официальная документация лучше чем у большинства популярных языков.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение26.07.2022, 00:03 


21/05/16
4292
Аделаида
При открытии файла (функция open) добавьте параметр encoding = 'utf-8'.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение26.07.2022, 03:09 


27/09/19
189
kotenok gav в сообщении #1561070 писал(а):
При открытии файла (функция open) добавьте параметр encoding = 'utf-8'.


Спасибо большое! Именно это и помогло, теперь все хорошо работает! Только я сделал utf-16

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import os, pyperclip

text = pyperclip.paste()

b = text#.encode('cp1251').decode('utf-16')

print('Как назвать файл?')

y = input()

folder = 'C:/Users/e8921/OneDrive/Рабочий стол'

file_name = f'{y}.py'

path = os.path.join(folder, file_name)

copy = 'pyperclip.copy('

close = ')'

t="'"

with open(path,'w', encoding="utf-16") as tw:
     tw.write(f"import os, pyperclip, subprocess\n{copy}{t}{b}{t}{close}")
 


-- 26.07.2022, 03:10 --

aitap в сообщении #1561023 писал(а):
Как именно Вы записываете текст в файл?

Чуть выше полностью текст программы написал)

-- 26.07.2022, 03:13 --

mihaild в сообщении #1561058 писал(а):
Если хотите научиться программировать, а не просто перебирать комбинировать ответы со stackoverflow в надежде, что результат будет работать достаточно часто - придется научиться работать с документацией. Тем более что у питона официальная документация лучше чем у большинства популярных языков.

Я не планирую становиться программистом, я чисто для себя маленькие полезные программки пишу, для удобства)) Актуальны ли предыдущие вопросы?) Спасибо за помощь!

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение26.07.2022, 09:14 


15/11/15
984
kot-obormot в сообщении #1561076 писал(а):
Чуть выше полностью текст программы написал)

Вы вставили две строки, в которых, по видимому, вы работаете с буфером обмена. Может, ошибка возникала на этом уровне? Работы с файлом в коде нет.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение26.07.2022, 12:00 


15/11/15
984
Сорри, с телефона весь код не загрузился. Отменяю вопрос.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение26.07.2022, 15:46 


09/05/16
138
kot-obormot, поздравляю с решением проблемы, но на всякий случай ещё раз предупреждаю, что у Вас в программе есть ошибка типа "инъекция". Большая часть строк, содержащих ', заставит её создавать синтаксически неверные файлы, а некоторые специально подготовленные строки заставят её создавать файлы, выполняющие произвольный код на Python, а не копирующие текст в буфер обмена. В особо невезучем случае можно стереть такой программой все свои файлы.

Попробуйте выяснить, как на Python получить из строки другую строку, выполнение которой интерпретатором Python даст исходную. Начните со строки, состоящей из одной одинарной кавычки: a = "'". Попробуйте ключевые слова deparse, quote, escape, string representation.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение27.07.2022, 14:57 


27/09/19
189
aitap в сообщении #1561141 писал(а):
kot-obormot

Попробуйте выяснить, как на Python получить из строки другую строку, выполнение которой интерпретатором Python даст исходную. Начните со строки, состоящей из одной одинарной кавычки: a = "'". Попробуйте ключевые слова deparse, quote, escape, string representation.


Спасибо большое, вроде бы вот так получается) Если так шифровать кавычки, через такую последовательность, то не будет ли проблем?

Используется синтаксис Python
quote = "\""
quote = "\42"
quote = "\x22"
print(quote)


Тогда полный тест программы будет такой.

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
mport os, pyperclip, subprocess, os.path

text = pyperclip.paste()

print('Как назвать файл?')

y = input()

folder = 'C:/Users/e8921/OneDrive/Рабочий стол'

file_name = f'{y}.py'

path = os.path.join(folder, file_name)

copy = 'pyperclip.copy('

close = ')'

quote = "\'"
quote = "\42"
quote = "\x22"

with open(path,'w', encoding="utf-16") as tw:
     tw.write(f"import os, pyperclip, subprocess\n{copy}{quote}{text}{quote}{close}")


При этом, эта программа создает нужную программу с текстом

Используется синтаксис Python
import os, pyperclip, subprocess
pyperclip.copy("текст из буфера обмена")


Но почему-то эта программа в 2 строчки не копирует в буфер обмена нужную информацию у меня. Почему такое может быть, подскажите, пожалуйста?

-- 27.07.2022, 15:24 --

Используется синтаксис Python
print(chr(0x22))


Еще вот так можно)

-- 27.07.2022, 15:29 --

Я попробовал с последним вариантом, получилось! Еще добавил r перед строкой, чтобы буфер обмена правильно воспринимался

код: [ скачать ] [ спрятать ]
Используется синтаксис Python
import os, pyperclip, subprocess, os.path

text = pyperclip.paste()

print('Как назвать файл?')

y = input()

folder = 'C:/Users/e8921/OneDrive/Рабочий стол'

file_name = f'{y}.py'

path = os.path.join(folder, file_name)

copy = 'pyperclip.copy('

close = ')'

with open(path,'w', encoding="utf-16") as tw:
     tw.write(f"import os, pyperclip, subprocess\n{copy}{'r'}{chr(0x22)}{text}{chr(0x22)}{close}")
 


Только по-прежнему программа в 2 строчки не работает почему-то

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение28.07.2022, 08:46 


21/05/16
4292
Аделаида
kot-obormot в сообщении #1561233 писал(а):
Если так шифровать кавычки, через такую последовательность, то не будет ли проблем?

:facepalm:
Нет, даже пожалуй так: :facepalm: :facepalm: :facepalm:

-- 28 июл 2022, 15:21 --

В вашем сообщении прекрасно всё.
1) Вы явно не поняли, в чём состоит суть атаки.
2) Вы явно не понимаете, как работает присваивание - иначе бы не писали несколько присваиваний подряд.
3) Вы явно не понимаете, как работает \x - \x22 и есть знак ".

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение28.07.2022, 22:15 


27/09/19
189
kotenok gav в сообщении #1561271 писал(а):
Вы явно не поняли, в чём состоит суть атаки.

Я понял, что чрезмерное использование спецсимволами опасно, могут организовывать неожиданные структуры, что может привести к непредсказуемым последствиям. Нужно стараться избегать их использования в неожиданных местах. Я так это понял.

Да, может я что-то не понимаю, но я не претендую называться программистом или человеком, который хоть немного разбирается в программировании, я лишь простейшие программки делаю, которые мне помогают работать с компьютером немного, вот и все) Я никогда не погружался глубоко в чтение документации, к сожалению, мне это дается очень тяжко)

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение29.07.2022, 09:52 


21/05/16
4292
Аделаида
kot-obormot в сообщении #1561326 писал(а):
Я понял, что чрезмерное использование спецсимволами опасно, могут организовывать неожиданные структуры, что может привести к непредсказуемым последствиям. Нужно стараться избегать их использования в неожиданных местах. Я так это понял.

Нет, неправильно.
Прочитайте это (и подумайте, как это относится к вашей программе) и это.

 Профиль  
                  
 
 Re: Python. Проблема с кириллицей при записи в файл
Сообщение30.07.2022, 12:42 


09/05/16
138
kot-obormot, может быть, так будет проще разобраться?

Возьмём Ваш последний вариант, но вместо text = pyperclip.paste() временно сделаем text = "'" (если хотите, можете каждый раз копировать один апостроф в буфер обмена перед запуском программы). Это, я думаю, самый простой случай, в котором программа делает не то, что задумывалось. Какой файл она в этом случае создаст? Где в нём ошибка?

Какую комбинацию символов можно поместить между '...', чтобы на выходе снова получилась строка, содержащая апостроф? Какие две встроенные функции в Python могут генерировать такие комбинации символов для любых строк?

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 28 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group