1

*.txt を含むすべてのファイルをテキスト ファイルに出力しようとしています。フォルダは次のようになります。

\フォルダ file1.txt file2.txt file3.csv

私のpythonコードは次のようになります:

import glob
for text in glob.glob('*.txt'):
    print text

file=open('output.txt', 'w')
file.write(text)
file.close()

これを実行した後、アイドル ウィンドウ file1.txt file2.txt に入りますが、output.txt には file2.txt しか書き込まれていません。

これは結果を取得する簡単な方法だと思いましたが、「テキスト」全体を出力ファイルに強制する方法はありますか?

4

4 に答える 4

6

text実際には、出力ファイルに値全体を入れています。textあなたがそう思っているだけではありません。

割り当てられる唯一の場所textfor text in glob.glob('*.txt')ループ内です。ループの後、割り当てられた最後の値、つまり'file2.txt'.

やりたいことに近づく方法はいくつかあります。IDLE からではなくコマンド ラインからスクリプトを実行している場合は、(Unix の場合) 次のようにすることができます。

python my_script.py | tee output.txt

output.txt通常の s 以外に Python コードで何もする必要なく、スクリプトからのすべての出力をファイルにコピーしますprint

Lattyware で提案されprintているように呼び出す代わりに、直接書き出すこともできますが、手動で両方を実行しない限り、両方を実行することはできません。

少し簡単にするために、代わりに呼び出す関数を書くと、print両方をより便利に行うことができます。何かのようなもの:

with open('output.txt', 'w') as f:
    def my_print(str):
        print str
        f.write(str + '\n')

    for filename in glob.glob('*.txt'):
        my_print(filename)

本当にステートメントを使用したい場合は、もう少し手の込んだこともできますprint: reassignsys.stdoutは、Python からすべての出力を行う特別なオブジェクトです。これはおそらく必要以上に複雑ですが、見たい場合は尋ねてください。

于 2012-10-31T21:44:02.100 に答える
4

print()コンソールに出力するだけで、それ以上はありません。ファイルに書き込みたい場合は、それを実行してください。

ループ内にデータを書き込む必要があります。そうしないと、 の最後の値のみが書き込まれますtext

import glob

with open('output.txt', 'w') as file:
    for filename in glob.glob('*.txt'):
        file.write(filename+'\n')

file.write()デフォルトではそうしないので、追加した改行に注意してください。あなたが望むなら、あなたも自然にあなたと同じようにすることができますprint()。もう 1 つのオプションは、リストを作成してから項目のリストをファイルに書き込むことでしたが、それは少し遠回りです。

ファイルを開くためのステートメントの使用に注意してくださいwith。これにより、ファイルが自動的に閉じられ、例外が発生した場合でも閉じられるため、コードをより読みやすく完全なものにすることをお勧めします。

于 2012-10-31T21:45:31.510 に答える
3

現代のPythonを使ってそれを行う方法は次のとおりです。

from __future__ import print_function

import glob

with open("output.txt", "w") as fo:
    for name in glob.glob("*.txt"):
        print(name, file=fo)

これにより、ループがコンテキスト マネージャーに配置され、上位互換性のある印刷関数が使用されます。

于 2012-10-31T23:08:20.193 に答える
1

すでに正しく提示されている解決策のほとんどは、filewriteメソッドを使用することを含んでいるため、ここでは のみを使用する別の方法を示しprintます。

printステートメント (/!\ python 2.x) は、ファイルに書き込む簡単な方法を提供します。

with open('myfile.txt', 'w') as f:
    print >> f, 'StuffToWrite'

または、あなたのファイルに置き換えることができsys.stdoutます:

import sys
with open('myfile.txt', 'w') as f:
    sys.stdout = f
    print 'StuffToWrite'

stdout参考までに、いつでも元の端末に戻すことができますsys.__stdout__


ただし、これらは迅速で汚い解決策であるという事実を主張させてください。
主な利点は、あなたが書き込もうとしているものが と互換性がないことを気にする必要がないことですwriteprint魔法が機能します (機能するprint >> f, [1,2,3,4]場合でも、機能しf.write([1,2,3,4])ない場合でも)。

于 2012-10-31T22:10:11.750 に答える