1

.txt現在のディレクトリ内のすべてのフォルダを検索し、すべてのファイルを検索し、現在のディレクトリ内のすべてのファイルを(任意の順序で)連結したファイルを作成するPythonスクリプトを作成したいと思います。フォルダにサブフォルダがある場合、それらのサブフォルダを検索しないでください。例は

main_folder
  folder_1
    sub_folder
      file1.txt
    file2.txt
  folder_2
    file3.txt

スクリプトはの中に配置されmain_folderます。file2.txtfile3.txt(任意の順序で)を連結したファイルを作成する必要がありますmain_folder

.txt私の質問は、サブフォルダーに入らずに、フォルダーをトラバースしてファイルを探すようにPythonに指示するにはどうすればよいですか?

4

4 に答える 4

3

グロブを使用:

>>> import glob
>>> glob.glob('main_folder/*/*.txt')
['main_folder/folder_1/file2.txt', 'main_folder/folder_2/file3.txt']
于 2012-11-05T05:04:59.233 に答える
1

オプションを True に設定してos.walk()関数を使用します。返されたタプルのtopdownすべてを削除します。dirnames

for root, dirs, files in os.walk('/base/dir', topdown=True):
    del dirs[:]
...
于 2012-11-05T05:06:25.993 に答える
1

ドキュメントから:

topdownがの場合True、呼び出し元はdirnamesリストをその場で変更でき (おそらくdelまたは スライス割り当てを使用)、名前がdirnameswalk()に残っているサブディレクトリにのみ再帰します。これを使用して、検索を削除したり、特定の訪問順序を強制したり、呼び出し元が作成または名前変更したディレクトリについて通知したりしてから、再開することができます。walk()walk()

于 2012-11-05T04:58:16.630 に答える
0

Unix ベースのシステムを使用している場合は、このように pythonモジュールfindを使用するのが最も簡単な方法だと思います。このオプションを使用すると、たとえば、深さ>= 3ですべてのファイルを見つけるために使用できますcatsubprocessfind-depth-depth +3

>>> import subprocess
>>> lst = subprocess.check_output('find . -name "*.txt" -depth 2', shell=True)
>>> print lst
./folder_1/f1.txt
./folder_2/f2.txt 
>>> out_f = subprocess.check_output('cat '+lst.replace('\n', ' '), shell=True)
>>> print out_f
inside Folder_1
inside Folder 2

shell=True各引数を個別に指定することで、これを回避できます。

于 2012-11-05T05:24:51.660 に答える