Убедитесь, что вы понимаете три значения возврата os.walk
:
for root, subdirs, files in os.walk(rootdir):
имеет следующее значение:
root
: Текущий путь, который является "
subdirs
: файлы в root
каталога типов files
: файлы в root
(не в subdirs
) типа, отличного от каталога И используйте os.path.join
вместо конкатенации косой чертой! Ваша проблема - filePath = rootdir + '/' + file
- вы должны соединить текущую папку «walk» вместо самой верхней папки. Таким образом, это должно быть filePath = os.path.join(root, file)
. «Файл» BTW является встроенным, поэтому вы обычно не используете его как имя переменной.
Еще одна проблема - это ваши циклы, которые должны быть такими, например:
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()
Если вы используете Python 3.5+ или выше, вы можете сделать это в 1 строке.
import glob
for filename in glob.iglob(root_dir + '**/*.txt', recursive=True):
print(filename)
Как упоминалось в документации
Если рекурсивное значение истинно, шаблон «**» будет соответствовать любым файлам и ноль или более каталогам и подкаталогам.
blockquote>Если вы хотите каждый файл, вы можете использовать
import glob for filename in glob.iglob(root_dir + '**/*', recursive=True): print(filename)
Попробуйте следующее:
import os
import sys
for root, subdirs, files in os.walk(path):
for file in os.listdir(root):
filePath = os.path.join(root, file)
if os.path.isdir(filePath):
pass
else:
f = open (filePath, 'r')
# Do Stuff
Я думаю, проблема в том, что вы не обрабатываете вывод os.walk
правильно.
Сначала измените:
filePath = rootdir + '/' + file
на:
filePath = root + '/' + file
rootdir
- ваш фиксированный каталог запуска; root
- это каталог, возвращаемый os.walk
.
Во-вторых, вам не нужно отступать от цикла обработки файлов, так как нет смысла запускать его для каждого подкаталога. Вы получите root
для каждого подкаталога. Вам не нужно обрабатывать подкаталоги вручную, если вы не хотите что-то делать с самими каталогами.