我有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()
发布于 2010-02-06 17:48:17
确保理解os.walk
的三个返回值
for root, subdirs, files in os.walk(rootdir):
有以下含义:
root
:当前路径为"walked through"subdirs
:Files in root
of directoryfiles
:Files in root
(not in subdirs
) of directory“类型的目录中的文件
请使用os.path.join
,而不是用斜杠连接!你的问题是filePath = rootdir + '/' + file
-你必须连接当前的"walked“文件夹,而不是最上面的文件夹。所以那一定是filePath = os.path.join(root, file)
。顺便说一句,"file“是一个内置的,所以你通常不会使用它作为变量名。
另一个问题是你的循环,它应该是这样的,例如:
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()
发布于 2017-07-19 00:26:07
如果您使用的是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)
正如在documentation中提到的
如果recursive为true,则模式'**‘将匹配任何文件以及零个或多个目录和子目录。
import glob
for filename in glob.iglob(root_dir + '**/**', recursive=True):
print(filename)
发布于 2010-02-06 17:59:59
同意Dave Webb的观点,os.walk
将为树中的每个目录生成一个项目。事实是,你不需要关心subFolders
。
这样的代码应该可以工作:
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())
https://stackoverflow.com/questions/2212643
复制相似问题