Python 2.7: Imprimer dans un fichier

97

Pourquoi essayer d'imprimer directement dans un fichier au lieu de sys.stdoutproduire l'erreur de syntaxe suivante:

Python 2.7.2+ (default, Oct  4 2011, 20:06:09)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f1=open('./testfile', 'w+')
>>> print('This is a test', file=f1)
  File "<stdin>", line 1
    print('This is a test', file=f1)
                            ^
SyntaxError: invalid syntax

De l'aide (__ builtins__), j'ai les informations suivantes:

print(...)
    print(value, ..., sep=' ', end='\n', file=sys.stdout)

    Prints the values to a stream, or to sys.stdout by default.
    Optional keyword arguments:
    file: a file-like object (stream); defaults to the current sys.stdout.
    sep:  string inserted between values, default a space.
    end:  string appended after the last value, default a newline.

Alors, quelle serait la bonne syntaxe pour modifier les écritures d'impression de flux standard?

Je sais qu'il existe peut-être de meilleures façons d'écrire dans un fichier, mais je ne comprends vraiment pas pourquoi cela devrait être une erreur de syntaxe ...

Une belle explication serait appréciée!

Alex
la source
3
Êtes-vous sûr? print()est la fonction intégrée de python 3.x, tandis que printest l'opérateur python <3.x. Le message montre 2.7.2+.
khachik
2
Avez-vous from __future__ import print_function? En Python <3, l'impression est une déclaration:
Ari
1
Non! Je ne l'ai pas fait. Bien sûr, vous avez raison. Cela résout le problème. Bon sang! Ainsi, l'impression documentée dans l'aide (_ builtins_ ) est la future version (3.x) de print qui a une syntaxe différente. Merci beaucoup et à vous aussi, kachik
alex
2
OMI, help(__builtins__)afficher cela est un bug.
Wooble
3
... bien que, en étudiant plus en détail, python 2.7.2 possède une fonction d'impression intégrée, vous ne pouvez simplement pas y accéder facilement normalement ( __builtins__.__dict__['print'](value, file=f1)cela fonctionne, cependant).
Wooble

Réponses:

138

Si vous souhaitez utiliser la printfonction dans Python 2, vous devez importer depuis __future__:

from __future__ import print_function

Mais vous pouvez aussi avoir le même effet sans utiliser la fonction:

print >>f1, 'This is a test'
Gandaro
la source
72

print est un mot-clé en python 2.X. Vous devez utiliser ce qui suit:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Simon Bergot
la source
2
Vous devez ajouter '\ n' pour rendre cet équivalent à imprimer.
jlh
44

print(args, file=f1)est la syntaxe python 3.x. Pour python 2.x utilisez print >> f1, args.

citxx
la source
3
Je pense que vous devriez également mentionner from __future__ import print_function. Ensuite, vous pouvez utiliser la notation claire dans les deux, Python 2 et 3.
Martin Thoma
@moose, il y a déjà une excellente réponse de Gandaro, qui comprend ma réponse et votre note.
citxx
2
Je reçois AttributeError: 'str' object has no attribute 'write'votre syntaxe python3
Suncatcher
5
@Suncatcher, vous essayez probablement de passer la chaîne contenant le nom de fichier en tant que f1 au lieu de l'objet fichier réel. Vous devez d'abord ouvrir le fichier pour l'écriture:f1 = open('path_to_your_file', 'w')
citxx
Ouais, j'ai pensé que ça devrait être le nom du fichier, pas l'objet du fichier.
Suncatcher
13

Vous pouvez exporter l'instruction d'impression vers un fichier sans modifier aucun code. Ouvrez simplement une fenêtre de terminal et exécutez votre code de cette manière:

python yourcode.py >> log.txt
Lune Noire
la source
11

Cela redirigera votre sortie 'impression' vers un fichier:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Daoctor
la source
est-ce un patching de singe?
Sarath Sadasivan Pillai du
6

En Python 3.0+, printest une fonction que vous appelleriez print(...). Dans la version précédente, printest une déclaration que vous feriez avec print ....

Pour imprimer dans un fichier en Python antérieur à 3.0, vous feriez:

print >> f, 'what ever %d', i

L' >>opérateur dirige l'impression vers le fichier f.

Nam Nguyen
la source
Je voudrais imprimer un tableau entier dans le fichier. Si j'utilise votre code, seules la tête et la queue du tableau ont été imprimées, comme la sortie du terminal. Comment imprimer toutes les lignes du tableau dans le fichier?
Sigur
@Sigur "Comme la sortie du terminal" Désolé, mais le bogue est ailleurs. Vous ne dites pas à Python d'imprimer le tout, c'est pourquoi ce n'est pas le cas.
wizzwizz4