Python 2.7: Drukuj do pliku

97

Dlaczego próba drukowania bezpośrednio do pliku zamiast sys.stdoutgenerowania następującego błędu składniowego:

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

Z pomocy (__ builtins__) mam następujące informacje:

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.

Jaka byłaby zatem właściwa składnia do zmiany standardowych zapisów strumieniowych?

Wiem, że istnieją inne, być może lepsze sposoby zapisywania do pliku, ale naprawdę nie rozumiem, dlaczego powinien to być błąd składni ...

Byłoby mile widziane miłe wyjaśnienie!

Alex
źródło
3
Jesteś pewny? print()jest funkcją wbudowaną w pythonie 3.x, natomiast printoperatorem jest python <3.x. Post pokazuje 2.7.2+.
khachik
2
Zrobiłeś from __future__ import print_function? W Pythonie <3 print to instrukcja:
Ari
1
Nie! Ja nie. Oczywiście, że masz rację. To rozwiązuje problem. Cholera! Tak więc udokumentowany print w pomocy (_ builtins_ ) jest przyszłą (3.x) wersją print, która ma inną składnię. Dziękuję bardzo i tobie, kachik
alex
2
IMO, help(__builtins__)wyświetlanie tego w ogóle jest błędem.
Wooble
3
... chociaż, badając dalej, python 2.7.2 nie mają wbudowaną funkcją druku, po prostu nie może uzyskać do niego dostęp łatwo normalnie ( __builtins__.__dict__['print'](value, file=f1)działa, choć).
Wooble

Odpowiedzi:

138

Jeśli chcesz użyć printfunkcji w Pythonie 2, musisz zaimportować z __future__:

from __future__ import print_function

Ale możesz mieć ten sam efekt również bez korzystania z funkcji:

print >>f1, 'This is a test'
Gandaro
źródło
72

print jest słowem kluczowym w Pythonie 2.X. Powinieneś użyć następujących:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Simon Bergot
źródło
2
Musisz dodać „\ n”, aby to było równoważne z print.
jlh
44

print(args, file=f1)jest składnią języka Python 3.x. W przypadku Pythona 2.x użyj print >> f1, args.

citxx
źródło
3
Myślę, że powinieneś również wspomnieć from __future__ import print_function. Następnie możesz użyć wyraźnej notacji w obu Pythonie 2 i 3.
Martin Thoma
@moose, jest już doskonała odpowiedź Gandaro, która obejmuje moją odpowiedź i Twoją notatkę.
citxx
2
Dostaję AttributeError: 'str' object has no attribute 'write'z twoją składnią python3
Suncatcher
5
@Suncatcher, prawdopodobnie próbujesz przekazać ciąg zawierający nazwę pliku jako f1 zamiast rzeczywistego obiektu pliku. Najpierw musisz otworzyć plik do zapisu:f1 = open('path_to_your_file', 'w')
citxx
Tak, pomyślałem, że powinna to być nazwa pliku, a nie obiekt pliku.
Suncatcher
13

Możesz wyeksportować instrukcję drukowania do pliku bez zmiany kodu. Po prostu otwórz okno terminala i uruchom kod w ten sposób:

python yourcode.py >> log.txt
Ciemny Księżyc
źródło
11

Spowoduje to przekierowanie wyjścia 'print' do pliku:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Daoctor
źródło
czy to małpa łata?
Sarath Sadasivan Pillai
6

W Pythonie 3.0+ printjest to funkcja , którą można wywołać print(...). We wcześniejszej wersji printjest to oświadczenie , które zrobiłbyś za pomocąprint ... .

Aby wydrukować do pliku w Pythonie starszym niż 3.0, zrobiłbyś:

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

>>Operator kieruje wydruk do pliku f.

Nam Nguyen
źródło
Chciałbym wydrukować całą tablicę do pliku. Jeśli używam twojego kodu, drukowane były tylko nagłówki i końce tablicy, podobnie jak dane wyjściowe z terminala. Jak wydrukować wszystkie wiersze tablicy do pliku?
Sigur
@Sigur "Podobnie jak w przypadku wyjścia z terminala" Przepraszamy, ale błąd jest gdzie indziej. Nie każesz Pythonowi wydrukować całości, dlatego tak nie jest.
wizzwizz4