web-dev-qa-db-fra.com

Comment rediriger la sortie d'impression vers un fichier TXT

J'ai effectué une recherche dans Google, Stack Overflow et mon Python) et je n'ai pas trouvé de réponse simple et pratique pour la question.

J'ai créé un fichier c:\goat.txt sur un ordinateur Windows 7 x64 et j'essaie d'imprimer "test" sur le fichier. J'ai essayé ce qui suit à partir des exemples fournis sur StackOverflow:

À ce stade, je ne souhaite pas utiliser le module de journalisation, car la documentation de ne me permet pas de créer un journal simple basé sur une condition binaire. L'impression est simple, mais la redirection de la sortie n'est pas évidente.

Un exemple simple et clair que je peux entrer dans mon interperter est le plus utile.

En outre, toutes les suggestions de sites d’information sont appréciées (PAS pydocs).

import sys
print('test', file=open('C:\\goat.txt', 'w')) #fails
print(arg, file=open('fname', 'w')) # above based upon this
print>>destination, arg

print>> C:\\goat.txt, "test" # Fails based upon the above
59
surfdork

Si vous êtes sur Python 2.5 ou version antérieure, ouvrez le fichier, puis utilisez l'objet file dans votre redirection:

log = open("c:\\goat.txt", "w")
print >>log, "test"

Si vous êtes sur Python 2.6 ou 2.7, vous pouvez utiliser print en tant que fonction:

from __future__ import print_function
log = open("c:\\goat.txt", "w")
print("test", file = log)

Si vous êtes sur Python 3.0 ou version ultérieure, vous pouvez omettre l'importation future.

Si vous souhaitez rediriger globalement vos instructions d'impression, vous pouvez définir sys.stdout:

import sys
sys.stdout = open("c:\\goat.txt", "w")
print ("test sys.stdout")
112
Eli Courtwright

Pour rediriger la sortie de tous, vous pouvez procéder comme suit:

import sys
with open('c:\\goat.txt', 'w') as f:
    sys.stdout = f
    print "test"
47
kolobos

Un moyen légèrement plus astucieux (qui diffère des réponses ci-dessus, qui sont toutes valables) serait de simplement diriger la sortie dans un fichier via la console.

Alors, imaginez que vous ayez main.py

if True:
    print "hello world"
else:
    print "goodbye world"

Tu peux faire

python main.py >> text.log

puis text.log obtiendra toute la sortie.

Ceci est pratique si vous avez déjà plusieurs instructions d'impression et que vous ne souhaitez pas les modifier individuellement pour les imprimer dans un fichier spécifique. Faites-le simplement au niveau supérieur et dirigez toutes les impressions vers un fichier (le seul inconvénient est que vous ne pouvez imprimer que vers une seule destination).

15
Tristan Tao

En me basant sur les réponses précédentes, je pense que c’est un cas d’utilisation idéal pour le style de gestionnaire de contexte (simple):

import sys

class StdoutRedirection:
    """Standard output redirection context manager"""

    def __init__(self, path):
        self._path = path

    def __enter__(self):
        sys.stdout = open(self._path, mode="w")
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        sys.stdout.close()
        sys.stdout = sys.__stdout__

et alors:

with StdoutRedirection("path/to/file"):
    print("Hello world")

De plus, il serait très facile d’ajouter des fonctionnalités à StdoutRedirection class (par exemple, une méthode permettant de changer le chemin).

4
z33k

En utilisant l'argument file de la fonction print, vous pouvez avoir différents fichiers par impression:

print('Redirect output to file', file=open('/tmp/example.log', 'w'))
3
Flippym
from __future__ import print_function
log = open("s_output.csv", "w",encoding="utf-8")
for i in range(0,10):
   print('\nHeadline: '+l1[i]', file = log)

S'il-vous-plait ajoutez encoding="utf-8" afin d'éviter l'erreur "Le codec 'charmap' ne peut pas encoder les caractères en position 12-32: les mappages de caractères sur"

1
Sijin John

simple en python 3.6

o = open('outfile','w')

print('hello world', file=o)

Je cherchais quelque chose comme à Perl

my $printname = "outfile"

open($ph, '>', $printname)or die "Could not open file '$printname' $!";

print $ph "hello world\n";

VEUILLEZ NE PAS MODIFIER CES SIMPLES 2 LIGNES DE CODE et les remplacer par quelque chose que vous devez utiliser avec .... ouvert pour chaque instruction imprimée. Cela ne me serait pas utile - ajoutez simplement un commentaire ou une réponse de votre part. Dans mon cas, j'ai ouvert deux fichiers de sortie une fois pour un fichier d'entrée, puis je les ai fermés et rouverts pour un deuxième fichier d'entrée, puis j'ai de nouveau bouclé la routine.

1
clint