33

複数のサブディレクトリを含むrootっぽいディレクトリがあり、そのすべてにファイル名data.txtが含まれています。私がやりたいのは、「ルート」ディレクトリを取得し、すべてのサブディレクトリを読み取り、サブディレクトリ内のすべての「data.txt」を読み取り、すべてのdata.txtファイルから次のファイルに書き込むスクリプトを作成することです。出力ファイル。

これが私のコードの抜粋です:

import os
import sys
rootdir = sys.argv[1]

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        for file in files:
            if (file == 'data.txt'):
                #print file
                with open(file,'r') as fin:
                    for lines in fin:
                        dosomething()

私のdosomething()部分-その部分を1つのファイルに対してのみ実行している場合に、それが機能することをテストおよび確認しました。また、代わりにファイルを印刷するように指示すると(コメント化された行)、スクリプトが「data.txt」を出力することも確認しました。

今、私がそれを実行すると、Pythonは私にこのエラーを与えます:

File "recursive.py", line 11, in <module>
    with open(file,'r') as fin:
IOError: [Errno 2] No such file or directory: 'data.txt'

なぜ見つからないのかわかりません。結局、「ファイルの印刷」行のコメントを外すと、data.txtが出力されます。私は間違って何をしていますか?

4

2 に答える 2

55

絶対パスを使用する必要があります。file変数は、ディレクトリパスを含まない単なるローカルファイル名です。root変数はそのパスです:

with open('output.txt','w') as fout:
    for root, subFolders, files in os.walk(rootdir):
        if 'data.txt' in files:
            with open(os.path.join(root, 'data.txt'), 'r') as fin:
                for lines in fin:
                    dosomething()
于 2012-11-26T18:48:15.333 に答える
0
[os.path.join(dirpath, filename) for dirpath, dirnames, filenames in os.walk(rootdir) 
                                 for filename in filenames]

ツリーを取得するための機能的なアプローチは、より短く、よりクリーンで、よりPythonicに見えます。

を任意の関数にラップしos.path.join(dirpath, filename)て、取得したファイルを処理したり、パスの配列を保存してさらに処理したりできます。

于 2018-02-10T11:34:55.520 に答える