Невозможно использовать метод getsize с возвращенными файлами os.walk()

Я пытаюсь создать небольшую программу, которая просматривает каталог (так как я хочу рекурсивно найти все файлы в подкаталогах, которые я использую os.walk()).

Вот мой код:

import os
import os.path
filesList=[]
path = "C:\\Users\Robin\Documents"
for(root,dirs,files) in os.walk(path):
   for file in files:
      filesList+=file

Затем я пытаюсь использовать метод os.path.getsize() для элементов filesList, но он не работает.

Действительно, я понимаю, что этот код заполняет список файлов List списком символов. Я не знаю, что делать, я пробовал несколько других вещей, таких как:

for(root,dirs,files) in os.walk(path):
filesList+=[file for file in os.listdir(root) if os.path.isfile(file)]

Это дает мне файлы, но только один, который даже не виден при поиске в каталоге.

Может кто-нибудь объяснить мне, как получить файлы, с которыми мы можем работать (то есть получить их размер, хэшировать или изменить их...) с помощью os.walk? Я новичок в Python, и я не очень понимаю, как использовать os.walk().

2 ответа

Решение

Я подозреваю, что проблема, с которой вы сталкиваетесь, заключается в том, что file содержит только имя файла, а не каталоги, по которым вы должны перемещаться из начальной папки. Вы должны использовать os.path.join объединить имя файла с папкой, в которой он находится, root значение, полученное от os.walk:

for(root,dirs,files) in os.walk(path):
    for file in files:
        filesList.append(os.path.join(root, file))

Теперь все имена файлов в filesList будет приемлемым для os.path.getsize и другие функции (например, open).

Я также исправил вторичную проблему, которая заключается в том, что вы используете += расширить список не будет работать так, как вы хотели. Вам нужно будет обернуть новый путь к файлу в списке, чтобы это работало. С помощью append больше подходит для добавления одного значения в конец списка.

Если вы хотите получить список файлов, включая путь, используйте:

for(root, dirs, files) in os.walk(path):
    fullpaths = [os.path.join(root, fil) for fil in files]
    filesList+=fullpaths
Другие вопросы по тегам