Уведомления

Группа в Telegram: @pythonsu

#1 Июль 4, 2008 20:36:48

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл

Знаю, что тем про это достаточно на форуме, прочитал все, в основном встречается ситуация когда некий список/переменная etc просто не записывается в файл, тут другая проблема чуть-чуть. Все записывается и прекрасно, но при открытии файла натыкаюсь на это:

S'\xef\xf0\xe8\xe2\xe5\xf2'
p0
.S'\xe5'
p0
.S'\xfd'
p0
.S'\xef\xf0\xe8\xe2\xfd\xf2'
p0
.S'\xef\xf0\xe8\xe2\xe5\xf2'
p0
.S'\xef\xf0\xe8\xe2\xe5\xf2'
p0
.S'\xef\xee\xea\xe0'
p0
.S'\xef\xee\xea\xe0'
p0
.
Програмирую на питоне от силы неделю. Сталкивался с этой проблемой, но как то получалось обходить эти случаи использованием других операторов. Вот часть кода программы:
pismo=str(raw_input("Введите текст:"))
pickle.dump(pismo,log)
В этом случае выводит в виду приведенном выше (pickle использовался не единожды в программе). Что странно, если использовать добавление всех значений, которые надо записать в файл, в один список а потом вывести его оператором log.writelines(report), то кодировка остается нормальной, но убираются все пробелы из списка (или строки, пробовал два варианта), из-за чего лог становиться не читаемым. Про форматирование текста введенных в поле нашел мало, а уж про форматирование на вывод в файл почти ничего,. Поэтому решил разобраться до конца с pickle. Кодировка по умолчанию для всего документа стоит cp1251. Опять же пробовал разные кодировки, вывод в файл производится в том же самом виде как было описанно в первом примере. Может я и пропустил что то, не обессудьте, объясните :)



Офлайн

#2 Июль 4, 2008 21:38:26

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Проблема в кодировке вывода строки в файл

Оригинальное решение - использовать pickle для логирования - и жаловаться на плохо читаемый результат :) Я был просто поражен до глубины души :)

pickle - для сериализации/десериализации. И ни для чего больше. Формат стоит рассматривать как черный ящик - работает, и ладно.

То, что тебе было нужно: log.write('\n'.join(report)).

Вырезка из хелпа: writelines() does not add line separators. Поэтому переводы строк вставляются вручную.



Отредактировано (Июль 4, 2008 21:38:48)

Офлайн

#3 Июль 4, 2008 21:44:27

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

Проблема в кодировке вывода строки в файл

1. writelines не пишет переносов строк в файл, об этом ты должен позаботиться сам: "report = ". Или:

for line in report:
    print>>log, line  # не будет работать в Python 3, можно заменить на log.write(line + '\n')
2. pickle занимается сериализацией объектов Python. Не стоит пытаться “на глаз” понять его вывод.

..bw



Офлайн

#4 Июль 4, 2008 22:36:18

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл

Спасибо, что просвятили касательно pickle, щас понимаю что это было глупо) но к сожалению там, где я это нашел было сказано, что это подходит для импортирования строк в файл.
Но проблема не только в переходе на следующую строчку, но в основном, в том что он убирает и пробелы тоже. Допустим есть список , вот первый элемент он пишет в файле как “солнцесветит”, хотя требуется чтобы он в файле написал “солнце светит”, а потом перескочил на новую строку. То есть я не могу вставить в середину элемента 0го индекса пробел.
Попробовал перевести все в строку, и разбить string.split() чтобы потом после каждого элемента ставить пробел, а в конце переход на другую строчку
Получилось вот что:

   report.append(pismo)
z=repr(report)
z=string.split(z)
for i in range(1,len(z)):
log.write(z[i]+" ")
В конце по идеи он должен бы был выводить значения по элементно и прибавлять пробел после каждого, но проверить не удалось, так как он в этом случае тоже начал выводить в файл примерно такое: “屸敦屸敥屸敦屸攰屸敢屸攰屸昱屸晣屸敦屸昰屸敥屸攳屸昰屸攰屸散屸敡屸攰❝”, кстати это сообщение он написал иероглифами, а если написать предложение состоящее из двух слов, то пишет уже в привычном виде “S'\xef\xf0\xe8\xe2\xfd\xf2'
”. Сильно ногами не бейте, просто не очень понимаю механизма и выбор кодировки который он выбирает для вывода данных из программы в файл…

P.S. извините, что сразу не сказал насчет пробелов, подумал если справлюсь с переходом на другую строку, то и пробелами не составит труда разобраться…



Отредактировано (Июль 4, 2008 22:43:47)

Офлайн

#5 Июль 4, 2008 23:14:56

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл

приведи код полнлстью.

подозреваю что там какой-то мудреж с кодировками.



Офлайн

#6 Июль 4, 2008 23:18:10

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл


#-*- coding: cp1251 -*-
import string
import os
t,z=0,0
log=open(“logfile.txt”,“ab”)
report=
while t!=1:
pismo=str(raw_input(“Введите текст:”))
report.append(pismo)
z=repr(report)
z=string.split(z)
for i in range(0,len(z)):
log.write(z)
what_replace=str(raw_input(“Какую букву(сочетание) хотите заменить?:”))
where_replace=str(raw_input(“На что заменить?:”))
result=string.replace(pismo,what_replace,where_replace)
print (“Результат замены:”),result
question=str(raw_input(“введите Y - если хотите продолжить, Все что угодно - нет:”))
question=string.lower(question)
if question==“y”:
continue
else:
break
log.close()
raw_input()
Вот программы полностью, сделана в принципе, только для отработки новых знаний, не более того…



Отредактировано (Июль 4, 2008 23:37:10)

Офлайн

#7 Июль 5, 2008 08:07:28

Andity
От:
Зарегистрирован: 2008-02-22
Сообщения: 63
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл

Moonbite2006
z=repr(report)
почему именно repr()? это ведь внутренее представленеие объекта в виде строки. Если в дальнейшем, нужно считывать список из файла, то можно и так его записать, самое простое открытым текстом:

for l in report:  ## просто идем по списку, т.к. список итерируем (можно "пересчитывать поэлементно")
  log.write(l+'\n')

а прочитать в список тогда так:
lst = []
f = open('logfile.txt')
for i in f:  ## файл тоже итерируем.
    lst.append(i.rstrip())  ## rstrip() - убирает справа пробелы, \n, и т.п.

все это избавляет от этих range, len, split 'ов ужасных.



Офлайн

#8 Июль 5, 2008 10:01:34

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблема в кодировке вывода строки в файл

Andity, спасибо большое, все работает как надо. Только все равно не понятна причина появления этих иероглифоф, как в файле, так и на экране, а не понимая природы, сложно что то исправлять… ну ладно, будем думать…



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version