Pythonの再帰的なフォルダの読み取り 質問する

Pythonの再帰的なフォルダの読み取り 質問する

私は C++/Obj-C の経験があり、最近 Python を知り始めました (1 時間ほど書いています)。フォルダー構造内のテキスト ファイルの内容を再帰的に読み取るスクリプトを作成しています。

私が抱えている問題は、私が書いたコードが 1 つのフォルダーの深さでしか機能しないことです。コードを見るとその理由がわかります (を参照#hardcoded path)。Python の経験がまだ浅いため、今後どのように進めていけばよいのかわかりません。

Python コード:

import os
import sys

rootdir = sys.argv[1]

for root, subFolders, files in os.walk(rootdir):

    for folder in subFolders:
        outfileName = rootdir + "/" + folder + "/py-outfile.txt" # hardcoded path
        folderOut = open( outfileName, 'w' )
        print "outfileName is " + outfileName

        for file in files:
            filePath = rootdir + '/' + file
            f = open( filePath, 'r' )
            toWrite = f.read()
            print "Writing '" + toWrite + "' to" + filePath
            folderOut.write( toWrite )
            f.close()

        folderOut.close()

ベストアンサー1

の 3 つの戻り値を必ず理解してくださいos.walk:

for root, subdirs, files in os.walk(rootdir):

次のような意味を持ちます:

  • root: 現在「歩いている」パス
  • subdirs:rootディレクトリタイプのファイル
  • files:ディレクトリ以外のタイプのファイルroot( にはない)subdirs

また、os.path.joinスラッシュで連結するのではなく、 を使用してください。問題はfilePath = rootdir + '/' + file、最上位のフォルダーではなく、現在「ウォークされている」フォルダーを連結する必要があることです。つまり、 である必要がありますfilePath = os.path.join(root, file)。ちなみに、「file」は組み込みなので、通常は変数名として使用しません。

もう 1 つの問題はループです。これは次のようになります。たとえば、次のようになります。

import os
import sys

walk_dir = sys.argv[1]

print('walk_dir = ' + walk_dir)

# If your current working directory may change during script execution, it's recommended to
# immediately convert program arguments to an absolute path. Then the variable root below will
# be an absolute path as well. Example:
# walk_dir = os.path.abspath(walk_dir)
print('walk_dir (absolute) = ' + os.path.abspath(walk_dir))

for root, subdirs, files in os.walk(walk_dir):
    print('--\nroot = ' + root)
    list_file_path = os.path.join(root, 'my-directory-list.txt')
    print('list_file_path = ' + list_file_path)

    with open(list_file_path, 'wb') as list_file:
        for subdir in subdirs:
            print('\t- subdirectory ' + subdir)

        for filename in files:
            file_path = os.path.join(root, filename)

            print('\t- file %s (full path: %s)' % (filename, file_path))

            with open(file_path, 'rb') as f:
                f_content = f.read()
                list_file.write(('The file %s contains:\n' % filename).encode('utf-8'))
                list_file.write(f_content)
                list_file.write(b'\n')

ご存知ない方のために説明すると、withファイルに関するステートメントは省略形です。

with open('filename', 'rb') as f:
    dosomething()

# is effectively the same as

f = open('filename', 'rb')
try:
    dosomething()
finally:
    f.close()

おすすめ記事