Это лучший ответ
Возможно, вы захотите использовать ftp.nlst()
вместо ftp.retrlines()
. Это даст вам именно то, что вы хотите.
Если вы не можете, прочитайте следующее:
Генераторы для процессов sysadmin
В своем теперь известном обзоре, Советы по созданию генератора для системных программистов. Введение , Дэвид М. Бизли (David M. Beazley) дает множество рецептов, чтобы ответить на такую проблему с данными в коде wuick и многоразового использования.
E.G:
# empty list that will receive all the log entry
log = []
# we pass a callback function bypass the print_line that would be called by retrlines
# we do that only because we cannot use something better than retrlines
ftp.retrlines('LIST', callback=log.append)
# we use rsplit because it more efficient in our case if we have a big file
files = (line.rsplit(None, 1)[1] for line in log)
# get you file list
files_list = list(files)
Почему бы нам сразу не создать список?
Ну, это потому, что выполнение этого способа дает вам большую гибкость: вы можете применить любой промежуточный генератор для фильтрации файлов, прежде чем превратить его в files_list
: это похоже на конвейер, добавьте строку, вы добавите процесс без перегрева (так как это генераторы). И если вы избавитесь от retrlines
, это все равно будет работать, даже лучше, потому что вы не сохраните список ни разу.
РЕДАКТИРОВАТЬ: хорошо, я прочитал комментарий к другому ответу, и он говорит, что это не будет работать, если в имени есть пробел.
Круто, это проиллюстрирует, почему этот метод удобен. Если вы хотите что-то изменить в процессе, вы просто измените строку. Обмен:
files = (line.rsplit(None, 1)[1] for line in log)
и
# join split the line, get all the item from the field 8 then join them
files = (' '.join(line.split()[8:]) for line in log)
Хорошо, здесь это может быть неочевидно, но для сценариев с большими пакетными процессами это хорошо: -)