2016-07-04 3 views
2

У меня есть файл текс, который был создан из источника первого использования Сфинкса, она кодируется как UTF-8 без BOM (в соответствии с Notepad ++) и назван final_report.tex, с следующим содержанием:Python line.replace возвращает UnicodeEncodeError

% Generated by Sphinx. 
\documentclass[letterpaper,11pt,english]{sphinxmanual} 
\usepackage[utf8]{inputenc} 
\begin{document} 

\chapter{Preface} 
Krimson4 is a nice programming language. 
Some umlauts äöüßÅö. 
That is an “double quotation mark” problem. 
Johnny’s apostrophe allows connecting multiple ports. 
Components that include data that describe how they ellipsis … 
Software interoperability – some dash – is not ok. 
\end{document} 

Теперь, прежде чем скомпилировать источник tex в pdf, я хочу заменить некоторые строки в тексте tex, чтобы получить более приятные результаты. Мой сценарий был вдохновлен another SO question.

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
import os 

newFil=os.path.join("build", "latex", "final_report.tex-new") 
oldFil=os.path.join("build", "latex", "final_report.tex") 

def freplace(old, new): 
    with open(newFil, "wt", encoding="utf-8") as fout: 
     with open(oldFil, "rt", encoding="utf-8") as fin: 
      for line in fin: 
       print(line) 
       fout.write(line.replace(old, new)) 
    os.remove(oldFil) 
    os.rename(newFil, oldFil) 

freplace('\documentclass[letterpaper,11pt,english]{sphinxmanual}', '\documentclass[letterpaper, 11pt, english]{book}') 

Это работает на Ubuntu 16.04 с Python 2.7, а также Python 3.5, , но он не на Windows, с Python 3.4. Сообщения об ошибке я получаю:

где 201c стендов для левого знака двойных кавычек. Если я удаляю проблематичный характер, сценарий продолжается до тех пор, пока не найдет следующий проблемный символ.

В конце концов, мне нужно решение, которое работает на Linux и Windows с Python 2.7 и 3.x. Я пробовал довольно много решений, предложенных здесь на SO, но пока не может найти тот, который работает для меня ...

+0

Привет @matth что делать вам есть в строке 19? –

+0

В моем примере нет 19 строк, я предполагаю, что сообщение об ошибке относится к строке 19 файла 'cp850.py'. – matth

+0

related: http://stackoverflow.com/questions/10971033/backporting-python-3-openencoding-utf-8-to-python-2 – matth

ответ

2

Вы должны указать правильную кодировку с encoding="the_encoding":

with open(oldFil, "rt", encoding="utf-8") as fin, open(newFil, "wt", encoding="utf-8") as fout: 

Если вы не будет использоваться предпочтительная кодировка.

open

В текстовом режиме, если кодировка не указана кодировку зависит от платформы: locale.getpreferredencoding (False) вызывается для получения текущей локали кодирования

+0

@matth, какая двойная кавычка? Если у вас все еще есть проблемы с кодировкой, то у вас нет данных, закодированных utf-8. –

+0

Какая новая ошибка? –

+0

@matth, вы указали кодировку как utf-8 для обоих annd, ошибка возникает при записи? –

Смежные вопросы