我有一个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()
如果您使用的是Python3.5或更高版本,您可以在一行中完成这项工作。
如documentation所述
如果你想要每个文件,你可以使用
确保您理解
os.walk
的三个返回值:具有以下含义:
root
:当前路径为“已遍历”subdirs
:类型目录root
中的文件files
:目录以外类型的root
(不在subdirs
)中的文件请使用
os.path.join
而不要用斜线连接!您的问题是filePath = rootdir + '/' + file
-您必须连接当前“walked”文件夹,而不是最上面的文件夹。所以那一定是filePath = os.path.join(root, file)
。顺便说一句,“file”是一个内置的,所以通常不把它用作变量名。另一个问题是循环,应该是这样的,例如:
如果您不知道,文件的
with
语句是一个速记:同意Dave Webb,
os.walk
将为树中的每个目录生成一个项。事实上,你不需要关心subFolders
。这样的代码应该可以工作:
相关问题 更多 >
编程相关推荐