2010-11-22 5 views
2

J'utilise Python pour traiter du texte brut dans LaTeX, donc je dois être capable d'écrire des choses comme \begin{enumerate} ou \newcommand dans un fichier. Lorsque Python écrit cela dans un fichier, cependant, il interprète \b et \n comme des caractères spéciaux.Comment écrire des caractères spéciaux (" n", " b", ...) dans un fichier en Python?

Comment puis-je obtenir Python pour écrire \newcommand dans un fichier, au lieu d'écrire ewcommand sur une nouvelle ligne?

Le code est quelque chose comme ça ...

with open(fileout,'w',encoding='utf-8') as fout: 
    fout.write("\begin{enumerate}[1.]\n") 

Python 3, Mac OS 10.5 PPC

+2

Il est extrêmement important de noter que ce n'est pas « quand Python écrit ceci dans un fichier », il est « quand Python analyse un littéral de chaîne à partir du code source ". Vous pouvez lire \ b et \ n à partir d'autres fichiers, d'entrées de console utilisateur, de sources réseau, de pigeons de support, etc., et ils ne seront pas interprétés comme des caractères de contrôle. –

Répondre

8

Une solution est d'échapper au caractère d'échappement (\). Cela se traduira par un anti-slash avant le caractère b au lieu d'échapper b:

with open(fileout,'w',encoding='utf-8') as fout: 
    fout.write("\\begin{enumerate}[1.]\n") 

Ce sera écrit dans le fichier comme

\begin{enumerate}[1.]<newline> 

(je suppose que le \n à la fin est une volontaire Si ce n'est pas le cas, utilisez le double échappement ici aussi: \\n.)

+0

Merci, fonctionne très bien. Je suis surpris que j'ai manqué ceci sur google: \ – registrar

8

Vous avez juste besoin de doubler la barre oblique inverse: \\n, \\b. Cela permettra d'échapper à l'antislash. Vous pouvez également mettre le préfixe r devant votre chaîne: r'\begin'. Comme détaillé here, cela permettra d'éviter les substitutions.

+0

+1 pour une réponse complète en seulement 2 lignes – ascobol

2

Vous pouvez également utiliser des chaînes brutes:

with open(fileout,'w',encoding='utf-8') as fout: 
    fout.write(r"\begin{enumerate}[1.]\n") 

Notez le « r » avant \ begin

+0

Il y a un problème avec "\ n" dans la chaîne brute ... –

+0

n'était pas le \ n supposé être échappé ? oh, bien .. print >> fout, r "\ begin {enumerate} [1.]" –

+0

Parfait! Merci - je savais que ça devait être quelque chose de simple comme ça. – registrar