Python 2.7:ファイルに出力


97

sys.stdout次の構文エラーを生成するのではなく、ファイルに直接出力しようとするのはなぜですか。

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

ヘルプ(__builtins__)から私は次の情報を持っています:

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.

では、標準のストリームプリントの書き込み先を変更するための正しい構文は何でしょうか。

私はファイルに書き込むための別のおそらくより良い方法があることを知っていますが、これが構文エラーであるべき理由が本当にわかりません...

素敵な説明をいただければ幸いです!


3
本気ですか?print()はPython 3.x組み込み関数ですが、printPython <3.x演算子です。投稿は示しています2.7.2+
khachik

2
しましたかfrom __future__ import print_function?Pythonの<3では、印刷は声明である:
アリ

1
番号!私はしませんでした。もちろんそうです。これで問題は解決しました。くそっ!したがって、help(_ builtins_)に文書化されているprintは、異なる構文を持つprintの将来の(3.x)バージョンです。kachik、どうもありがとうございました、あまりにもあなた
アレックス・

2
IMO、それをhelp(__builtins__)表示するのはバグです。
Wooble

3
...さらに調査すると、python 2.7.2に組み込みの印刷機能がありますが、通常__builtins__.__dict__['print'](value, file=f1)は簡単にアクセスできません(ただし、機能します)。
Wooble

回答:


138

printPython 2でこの関数を使用する場合は、次からインポートする必要があります__future__

from __future__ import print_function

ただし、関数を使用しなくても同じ効果が得られます。

print >>f1, 'This is a test'

72

printはpython 2.Xのキーワードです。以下を使用する必要があります。

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

2
これを印刷と同等にするには、「\ n」を追加する必要があります。
jlh

44

print(args, file=f1)Python 3.xの構文です。python 2.xの場合はを使用しますprint >> f1, args


3
あなたも言及すべきだと思いますfrom __future__ import print_function。そして、あなたは、両方の明確な表記法を使用することができ、Pythonの2と3
マーティン・トーマ

@moose、私の回答とあなたのメモを含む優れたガンダロの回答がすでにあります。
citxx 2015

2
私は取得AttributeError: 'str' object has no attribute 'write'あなたのpython3の構文で
サンキャッチャー

5
@Suncatcher、あなたはおそらく実際のファイルオブジェクトの代わりにf1としてファイル名を含む文字列を渡そうとしているでしょう。最初に書き込むためにファイルを開く必要があります:f1 = open('path_to_your_file', 'w')
citxx

ええ、私はそれがファイルオブジェクトではなくファイル名であるべきだと思いました。
サンキャッチャー2017

13

コードを変更せずに、印刷ステートメントをファイルにエクスポートできます。ターミナルウィンドウを開き、次の方法でコードを実行します。

python yourcode.py >> log.txt

11

これにより、「印刷」出力がファイルにリダイレクトされます。

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

モンキーパッチですか?
Sarath Sadasivan Pillai

6

Python 3.0以降でprintは、はで呼び出す関数ですprint(...)。以前のバージョンでprintは、はステートメントです。print ...

3.0より前のPythonでファイルに出力するには、次のようにします。

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

>>オペレータは、ファイルへの印刷を指示しますf


配列全体をファイルに出力したいのですが。私があなたのコードを使用する場合、ターミナルの出力のように、配列の先頭と末尾のみが出力されました。すべての配列行をファイルに出力する方法は?
Sigur

@Sigur「ターミナルからの出力のように」申し訳ありませんが、バグは別の場所にあります。すべてを印刷するようにPythonに指示しているわけではないので、そうではありません。
wizzwizz4
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.