Python 2.7: Cetak ke File

97

Mengapa mencoba mencetak langsung ke file alih-alih sys.stdoutmenghasilkan kesalahan sintaks berikut:

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

Dari bantuan (__ builtins__) saya memiliki info berikut:

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.

Jadi apa sintaks yang tepat untuk mengubah penulisan stream print standar?

Saya tahu bahwa ada beberapa cara yang mungkin lebih baik untuk menulis ke file tetapi saya benar-benar tidak mengerti mengapa ini harus menjadi kesalahan sintaks ...

Penjelasan yang bagus akan dihargai!

alex
sumber
3
Apakah kamu yakin print()adalah fungsi built-in python 3.x, sedangkan printoperator python <3.x. Posting menunjukkan 2.7.2+.
khachik
2
Benarkah from __future__ import print_function? Dalam Python <3, print adalah pernyataan:
Ari
1
Tidak! Aku tidak. Tentu saja Anda benar. Itu memecahkan masalah. Sial! Jadi cetakan terdokumentasi dalam bantuan (_ builtins_ ) adalah versi cetak masa depan (3.x) yang memiliki sintaks berbeda. Terima kasih banyak dan Anda juga, kachik
alex
2
IMO, help(__builtins__)menampilkan itu semua adalah bug.
Wooble
3
... meskipun, menyelidiki lebih lanjut, python 2.7.2 memang memiliki fungsi cetak built-in, Anda tidak dapat mengaksesnya dengan mudah secara normal ( __builtins__.__dict__['print'](value, file=f1)meskipun demikian).
Wooble

Jawaban:

138

Jika Anda ingin menggunakan printfungsi di Python 2, Anda harus mengimpor dari __future__:

from __future__ import print_function

Tetapi Anda juga dapat memiliki efek yang sama tanpa menggunakan fungsinya:

print >>f1, 'This is a test'
Gandaro
sumber
72

print adalah kata kunci di python 2.X. Anda harus menggunakan yang berikut ini:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()
Simon Bergot
sumber
2
Anda perlu menambahkan '\ n' agar setara dengan pencetakan.
jlh
44

print(args, file=f1)adalah sintaks python 3.x. Untuk penggunaan 2.x python print >> f1, args.

citxx
sumber
3
Saya pikir Anda juga harus menyebutkan from __future__ import print_function. Kemudian Anda dapat menggunakan notasi yang jelas di keduanya, Python 2 dan 3.
Martin Thoma
@moose, sudah ada jawaban Gandaro yang luar biasa, termasuk jawaban saya dan catatan Anda.
citxx
2
Saya mendapatkan AttributeError: 'str' object has no attribute 'write'sintaks python3 Anda
Suncatcher
5
@Suncatcher, Anda mungkin mencoba meneruskan string yang berisi nama file sebagai f1 alih-alih objek file sebenarnya. Anda perlu membuka file untuk menulis terlebih dahulu:f1 = open('path_to_your_file', 'w')
citxx
Ya, saya pikir itu harus nama file, bukan objek file.
Suncatcher
13

Anda dapat mengekspor pernyataan cetak ke file tanpa mengubah kode apa pun. Cukup buka jendela terminal dan jalankan kode Anda dengan cara ini:

python yourcode.py >> log.txt
Bulan gelap
sumber
11

Ini akan mengarahkan keluaran 'print' Anda ke sebuah file:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"
Daoctor
sumber
apakah itu menambal monyet?
Sarath Sadasivan Pillai
6

Di Python 3.0+, printadalah sebuah fungsi , yang akan Anda panggil print(...). Dalam versi sebelumnya, printadalah pernyataan , yang akan Anda buat dengan print ....

Untuk mencetak ke file dengan Python sebelum 3.0, Anda akan melakukan:

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

The >>Operator mengarahkan cetak ke file f.

Nam Nguyen
sumber
Saya ingin mencetak seluruh larik ke file. Jika saya menggunakan kode Anda, hanya kepala dan ekor array yang dicetak, seperti output dari terminal. Bagaimana cara mencetak semua baris array ke file?
Sigur
@Sigur "Seperti keluaran dari terminal" Maaf, tapi bugnya ada di tempat lain. Anda tidak memberi tahu Python untuk mencetak semuanya, itulah mengapa tidak.
wizzwizz4