при перечислении нескольких имен файлов с помощью os.walk, почему я не могу вызвать каждое имя файла через индекс списка? - PullRequest
0 голосов
/ 04 октября 2018

Приношу свои извинения, если об этом спросили и ответили - я тщательно искал, но не могу найти четкого объяснения поведения, которое вижу, и я очень плохо знаком с программированием и питоном.

Когда язапустите следующий код:

import os
directory = "J:"
extension = "pdf"

for root, dirs, files in os.walk(directory):
    for filename in files:
        if filename.endswith("." + extension):
            print(filename)

Он выдаст следующее:

Bristol.Investments.Ltd.y16m03.INVOICE.pdf
Bristol.Investments.Ltd.y16m04.INVOICE.pdf
Bristol.Investments.Ltd.y16m05.INVOICE.pdf
James.Cunningham.2017.PAID.pdf
random.test.file.pdf

Теперь, если бы я изменил это, чтобы закончить

print(filename[2])

Я быожидайте, что она напечатает третью строку следующим образом:

Bristol.Investments.Ltd.y16m05.INVOICE.pdf

Вместо этого я получаю третье письмо из каждой строки таким образом:

i
i
i
m
n

Может кто-нибудь объяснить, пожалуйста, такое поведение?В соответствии с документацией Python, os.walk выдает dirpath, dirnames, filenames, где «filenames» - это «список имен не-каталогов файлов в dirpath» - но, думаю, я не понимаю списки или как получить доступ к даннымвнутри них правильно.

Если бы кто-то мог объяснить, почему я вижу такое поведение и / или как вывести полное имя файла из списка имен файлов, я был бы очень признателен, спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

Как уже сказано в комментариях sjdm, проблема в том, что вы обращаетесь к 3-му элементу строки filename (который является символом), а не к 3-му элементу в списке файлов.

Toрешить эту проблему я предлагаю сохранить все имена файлов в списке:

import os
directory = "J:"
extension = "pdf"

pdf_files = []
for root, dirs, files in os.walk(directory):
    for filename in files:
        if filename.endswith("." + extension):
            print(filename)
            pdf_files.append(filename)

print(pdf_files)  # print all collected files
print(pdf_files[2]) # print third collected file
...