我有c++ /Obj-C背景,我刚刚发现Python(写了大约一个小时)。
我正在写一个脚本递归地读取文件夹结构中的文本文件的内容。
我的问题是,我写的代码将只工作于一个文件夹深度。我可以在代码中看到为什么(见#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()
如果你使用的是Python 3.5或更高版本,你可以在一行内完成。
import glob
# root_dir needs a trailing slash (i.e. /root/dir/)
for filename in glob.iglob(root_dir + '**/*.txt', recursive=True):
print(filename)
正如文档中提到的
如果递归为true,模式'**'将匹配任何文件以及零个或多个目录和子目录。
如果你想要每个文件,你可以使用
import glob
for filename in glob.iglob(root_dir + '**/**', recursive=True):
print(filename)
使用os.path.join()来构造你的路径-这样更整洁:
import os
import sys
rootdir = sys.argv[1]
for root, subFolders, files in os.walk(rootdir):
for folder in subFolders:
outfileName = os.path.join(root,folder,"py-outfile.txt")
folderOut = open( outfileName, 'w' )
print "outfileName is " + outfileName
for file in files:
filePath = os.path.join(root,file)
toWrite = open( filePath).read()
print "Writing '" + toWrite + "' to" + filePath
folderOut.write( toWrite )
folderOut.close()
如果你使用的是Python 3.5或更高版本,你可以在一行内完成。
import glob
# root_dir needs a trailing slash (i.e. /root/dir/)
for filename in glob.iglob(root_dir + '**/*.txt', recursive=True):
print(filename)
正如文档中提到的
如果递归为true,模式'**'将匹配任何文件以及零个或多个目录和子目录。
如果你想要每个文件,你可以使用
import glob
for filename in glob.iglob(root_dir + '**/**', recursive=True):
print(filename)
同意Dave Webb的观点。Walk将为树中的每个目录生成一个项。事实上,您不需要关心子文件夹。
这样的代码应该可以工作:
import os
import sys
rootdir = sys.argv[1]
for folder, subs, files in os.walk(rootdir):
with open(os.path.join(folder, 'python-outfile.txt'), 'w') as dest:
for filename in files:
with open(os.path.join(folder, filename), 'r') as src:
dest.write(src.read())