私は 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()