Найти - Пользователи
Полная версия: Проблема в кодировке вывода строки в файл
Начало » Python для новичков » Проблема в кодировке вывода строки в файл
1
Moonbite2006
Знаю, что тем про это достаточно на форуме, прочитал все, в основном встречается ситуация когда некий список/переменная 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. Опять же пробовал разные кодировки, вывод в файл производится в том же самом виде как было описанно в первом примере. Может я и пропустил что то, не обессудьте, объясните :)
Андрей Светлов
Оригинальное решение - использовать pickle для логирования - и жаловаться на плохо читаемый результат :) Я был просто поражен до глубины души :)

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

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

Вырезка из хелпа: writelines() does not add line separators. Поэтому переводы строк вставляются вручную.
bw
1. writelines не пишет переносов строк в файл, об этом ты должен позаботиться сам: "report = ". Или:
for line in report:
    print>>log, line  # не будет работать в Python 3, можно заменить на log.write(line + '\n')
2. pickle занимается сериализацией объектов Python. Не стоит пытаться “на глаз” понять его вывод.

..bw
Moonbite2006
Спасибо, что просвятили касательно 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. извините, что сразу не сказал насчет пробелов, подумал если справлюсь с переходом на другую строку, то и пробелами не составит труда разобраться…
shiza
приведи код полнлстью.

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

#-*- 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()
Вот программы полностью, сделана в принципе, только для отработки новых знаний, не более того…
Andity
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 'ов ужасных.
Moonbite2006
Andity, спасибо большое, все работает как надо. Только все равно не понятна причина появления этих иероглифоф, как в файле, так и на экране, а не понимая природы, сложно что то исправлять… ну ладно, будем думать…
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