Форум сайта python.su
AleksSRсразу сюда новый вариант копируй
Сделал
AleksSRпока что нужно правильно вывести то, что в utf-8
Можно ли работать с текстовыми файлами в cp-1251 кодировке для реализации данной задачи?
>>> 'абвг'.encode('cp1251').decode('cp866')
'рсту'
>>>
Отредактировано (Дек. 7, 2011 00:21:41)
Офлайн
py.user.nextAleksSRсразу сюда новый вариант копируй
Сделал
в каком виде сейчас цикл ?
def load_rules(ifname):
rules_lst = []
with open(ifname) as f:
for line in f:
print line.decode('cp866')
continue
lst = line.strip().split(';')
name = lst[1].lower()
expr_from = lst[0].strip('()')
sublst_to = lst[2].strip('()').split('|')
rules_lst.append([name, expr_from, sublst_to])
return rules_lst
Офлайн
проверил в винде на третьем питоне:
нужно файл с текстом сохранить в utf-8 без bom (notepad++ даёт это сделать)
а выводить нужно через print line.decode('utf-8')
на третьем питоне аналогичное сработало и вывело в консоль русские
Отредактировано (Дек. 7, 2011 12:24:23)
Офлайн
py.user.nextСделал, вот что выводится:
проверил в винде на третьем питоне:
нужно файл с текстом сохранить в utf-8 без bom (notepad++ даёт это сделать)
а выводить нужно через print line.decode('utf-8')
на третьем питоне аналогичное сработало и вывело в консоль русские
# -*- coding: utf-8 -*-
import re
textfile = 'file.txt'
rulesfile = 'rules.txt'
outfile = 'output.txt'
def load_rules(ifname):
rules_lst = []
with open(ifname) as f:
for line in f:
print line.decode('utf-8')
continue
lst = line.strip().split(';')
name = lst[1].lower()
expr_from = lst[0].strip('()')
sublst_to = lst[2].strip('()').split('|')
rules_lst.append([name, expr_from, sublst_to])
return rules_lst
#for r in load_rules(rulesfile):
# print r
def load_text(ifname):
with open(ifname) as f:
return next(f).strip()
#print load_text(textfile)
def repl_group(text, rule):
lst = []
expr, to_lst = rule[1:]
for tw in to_lst:
repl = re.sub(expr, tw, text)
lst.append(repl)
return lst
#print repl_group('abcd', [None, 'a|c', ['1', '2', '3']])
rules_lst = load_rules(rulesfile)
text = load_text(textfile)
out_lst = repl_group(text, rules_lst[0])
for t in (i for i in repl_group(text, rules_lst[2]) if i not in out_lst):
out_lst.extend(repl_group(t, rules_lst[0]))
out_lst = [i.decode('utf-8') for i in out_lst]
print u'; '.join(out_lst)
Отредактировано (Дек. 7, 2011 12:49:48)
Офлайн
теперь эти две введённые строки закомментируй (print и continue)
Офлайн
py.user.nextВывод:
теперь эти две введённые строки закомментируй (print и continue)
Офлайн
out_lst = [i.decode('utf-8') for i in out_lst]
print u'; '.join(out_lst)
with open(outfile, 'w') as f:
print >>f, u'; '.join(out_lst).encode('utf-8')
Офлайн
Не подскажите можно ли в данном случае решить проблему с кодировкой? Хотелось бы, чтобы ввод и вывод были в cp-1251, так как вывод идет в csv файл и в дальнейшем человек будет в ручную корректировать список запросов, а csv в кодировке utf-8 открывается с крокозябрами в экселе.
Офлайн
файлы file.txt, rules.txt сохраняются в cp1251
в коде все utf-8 в кавычках меняются на cp1251
а кодировка в начале скрипта если меняется на cp1251, то нужно и сам скрипт сохранить в cp1251
Офлайн
Кодировки пока еще не стал менять. Почему скрипт обрабатывает и записывает в выходной файл только первую строчку из исходного файла?
Офлайн