2016-07-04 4 views
2

I eine tex-Datei, die von der ersten Quelle unter Verwendung Sphinx erzeugt wurde, wird es als UTF-8 ohne BOM kodiert wird (gemäß Notepad ++) und final_report.tex genannt, mit folgendem Inhalt:Python line.replace kehrt 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} 

Jetzt, bevor ich die Tex-Quelle zu PDF kompiliere, möchte ich einige Zeilen in der Tex-Datei ersetzen, um bessere Ergebnisse zu erhalten. Mein Skript wurde von another SO question inspiriert.

#!/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}') 

Dies funktioniert auf Ubuntu 16.04 mit Python 2.7 sowie Python 3.5, aber es funktioniert nicht unter Windows mit Python 3.4. Die Fehlermeldung ich erhalte, ist:

wo 201c steht für linke doppelte Anführungszeichen. Wenn ich das problematische Zeichen entferne, fährt das Skript fort, bis es das nächste problematische Zeichen findet.

Am Ende brauche ich eine Lösung, die auf Linux und Windows mit Python 2.7 und 3.x funktioniert. Ich habe versucht, eine ganze Menge der hier auf SO vorgeschlagenen Lösungen, konnte aber noch nicht gefunden haben, funktioniert für mich ...

+0

Hallo zu bekommen @matth, was Sie tun in Zeile 19 haben? –

+0

Mein Beispiel hat keine 19 Zeilen, ich nehme an, die Fehlermeldung bezieht sich auf Zeile 19 der 'cp850.py' Datei. – matth

+0

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

Antwort

2

Sie müssen die richtige Codierung mit dem encoding="the_encoding" angeben:

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

Wenn Sie wird nicht die bevorzugte Kodierung verwendet.

open

Im Textmodus, wenn Codierung wird die Kodierung nicht angegeben verwendet wird, ist plattformabhängig: locale.getpreferredencoding (False) aufgerufen, um die aktuelle Locale

+0

@matth, was double quote? Wenn Sie immer noch Codierungsprobleme haben, dann haben Sie keine utf-8 codierten Daten –

+0

Was ist der genaue neue Fehler? –

+0

@matth, haben Sie die Codierung als utf-8 für beide angegeben und der Fehler passiert beim Schreiben? –

Verwandte Themen