Python 2.7: Dosyaya Yazdır


97

Neden sys.stdoutaşağıdaki sözdizimi hatası yerine doğrudan bir dosyaya yazdırmaya çalışmak?

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

Yardımdan (__ builtins__) Aşağıdaki bilgilere sahibim:

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.

Öyleyse, standart akış yazdırma yazımlarını değiştirmek için doğru sözdizimi nedir?

Dosyaya yazmak için farklı belki daha iyi yollar olduğunu biliyorum ama bunun neden bir sözdizimi hatası olması gerektiğini gerçekten anlamıyorum ...

Güzel bir açıklama memnuniyetle karşılanacaktır!


3
Emin misiniz? print()python 3.x yerleşik işlevi, printpython <3.x operatörüdür. Gönderi gösterir 2.7.2+.
khachik

2
Yaptın from __future__ import print_functionmı Python <3'te, print bir ifadedir:
Ari

1
Hayır! Ben yapmadım. Tabii ki haklısın. Bu sorunu çözer. Kahretsin! Dolayısıyla, yardımda belgelenen baskı (_ yerleşikler_ ), farklı bir sözdizimine sahip olan baskının gelecekteki (3.x) sürümüdür. Çok teşekkür ederim ve sen de, kachik
alex

2
IMO, bunu help(__builtins__)göstermek bir hata.
Wooble

3
... Daha fazla araştırma, piton 2.7.2, her ne kadar yok yerleşik bir yazdırma işlevi, sadece kolayca normalde erişemez var ( __builtins__.__dict__['print'](value, file=f1)gerçi, çalışır).
Wooble

Yanıtlar:


138

printFonksiyonu Python 2'de kullanmak istiyorsanız , içeri aktarmanız gerekir __future__:

from __future__ import print_function

Ancak işlevi kullanmadan da aynı etkiye sahip olabilirsiniz:

print >>f1, 'This is a test'

72

print python 2.X'te bir anahtar sözcüktür. Aşağıdakileri kullanmalısınız:

f1=open('./testfile', 'w+')
f1.write('This is a test')
f1.close()

2
Bunu yazdırmaya eşdeğer yapmak için '\ n' eklemeniz gerekir.
jlh

44

print(args, file=f1)python 3.x sözdizimidir. Python 2.x kullanımı için print >> f1, args.


3
Bence ayrıca bahsetmelisiniz from __future__ import print_function. O zaman hem Python 2 hem de 3 için net gösterimi kullanabilirsiniz.
Martin Thoma

@moose, benim cevabımı ve notunuzu içeren mükemmel bir Gandando cevabı zaten var.
citxx

2
Ben olsun AttributeError: 'str' object has no attribute 'write'sizin python3 sözdizimi ile
Suncatcher

5
@Suncatcher, muhtemelen dosya adını içeren dizeyi gerçek dosya nesnesi yerine f1 olarak geçirmeye çalışıyorsunuz. Önce yazmak için dosyayı açmanız gerekir:f1 = open('path_to_your_file', 'w')
citxx

Evet, dosya adı olması gerektiğini düşündüm, nesne değil.
Suncatcher

13

Herhangi bir kodu değiştirmeden print deyimini dosyaya aktarabilirsiniz. Basitçe bir terminal penceresi açın ve kodunuzu şu şekilde çalıştırın:

python yourcode.py >> log.txt

12

Bu, 'yazdırma' çıktınızı bir dosyaya yönlendirecektir:

import sys
sys.stdout = open("file.txt", "w+")
print "this line will redirect to file.txt"

maymun yamalıyor mu?
Sarath Sadasivan Pillai

6

Python 3.0+ ile arayabileceğiniz printbir işlevdirprint(...) . Önceki versiyonda, printile yapacağınız bir ifadedirprint ... .

3.0'dan önceki Python'da bir dosyaya yazdırmak için şunları yaparsınız:

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

>>Operatör dosyasına baskı yönlendirir f.


Dosyaya bütün bir diziyi yazdırmak istiyorum. Kodunuzu kullanırsam, terminalden çıktı gibi yalnızca dizinin başı ve sonu yazdırılır. Tüm dizi satırları dosyaya nasıl yazdırılır?
Sigur

@Sigur "Terminalden çıktı gibi" Üzgünüm, ama hata başka yerde. Python'a her şeyi yazdırmasını söylemiyorsun, bu yüzden değil.
wizzwizz4
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.