web-dev-qa-db-ja.com

Pythonを使ってディレクトリを繰り返す

与えられたディレクトリのサブディレクトリを反復処理してファイルを検索する必要があります。ファイルを取得したら、それを開いて内容を変更し、自分の行に置き換える必要があります。

私はこれを試しました:

import os

rootdir ='C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        f=open(file,'r')
        lines=f.readlines()
        f.close()
        f=open(file,'w')
        for line in lines:
            newline = "No you are not"
            f.write(newline)
        f.close()

しかし、私はエラーを受けています。何がおかしいのですか?

116
Wolf

ディレクトリを実際にたどることはあなたがそれをコード化したように働く。内側のループの内容を単純なprintステートメントで置き換えると、各ファイルが見つかったことがわかります。

import os
rootdir = 'C:/Users/sid/Desktop/test'

for subdir, dirs, files in os.walk(rootdir):
    for file in files:
        print os.path.join(subdir, file)

上記を実行してもまだエラーが発生する場合は、エラーメッセージを入力してください。

243
ChrisProsser

サブディレクトリ内のすべてのファイルを返すもう1つの方法は、Python 3.4で導入された pathlibモジュール を使用することです。これはファイルシステムパスを処理するオブジェクト指向のアプローチを提供します。 PyPi上のpathlib2モジュールを介して):

from pathlib import Path

rootdir = Path('C:/Users/sid/Desktop/test')
# Return a list of regular files only, not directories
file_list = [f for f in rootdir.glob('**/*') if f.is_file()]

# For absolute paths instead of relative the current dir
file_list = [f for f in rootdir.resolve().glob('**/*') if f.is_file()]

Python 3.5以降、globモジュールは再帰的ファイル検索もサポートしています。

import os
from glob import iglob

rootdir_glob = 'C:/Users/sid/Desktop/test/**/*' # Note the added asterisks
# This will return absolute paths
file_list = [f for f in iglob('**/*', recursive=True) if os.path.isfile(f)]

上記のアプローチのいずれかからのfile_listは、入れ子になったループを必要とせずに繰り返すことができます。

for f in file_list:
    print(f) # Replace with desired operations
8
joelostblom

2019現在、 glob.iglob(path/**, recursive=True) が最も解決されているようですPythonic解決策。

import glob, os

for filename in glob.iglob('/pardadox-music/**', recursive=True):
    if os.path.isfile(filename): # filter dirs
        print(filename)

出力:

/pardadox-music/modules/her1.mod
/pardadox-music/modules/her2.mod
...

ノート:
1 - glob.iglob

glob.iglob(pathname, recursive=False)

実際にそれらをすべて同時に格納することなく、glob()と同じ値を返すイテレータを返します。

2 - recursiveがTrueの場合、パターン'**'は任意のファイルに一致し、0個以上のdirectoriesおよびsubdirectoriesに一致します。

2
Pedro Lobito