операция с файлом Python - PullRequest
       0

операция с файлом Python

1 голос
/ 26 октября 2011

пожалуйста, что означает эта строка:

return [f[:f.rindex(".")] for f in os.listdir(path) if f and len(f) >= 4 and f[-2:] 

== "py" and f[-1] != "o" and f[-1] != "c"]

Я нашел ее в скрипте по этой ссылке:

http://www -users.cs.umn.edu / ~ mein / blender / plugins / python / misc / scriptloader / TheOneScript.py

Я знаю, что мне нужно было отделить имя файла от его расширения (.py) .. но почему лен(f)> = 4

, а как насчет f [-1]! = "o" или "c" ... что это значит?

Ответы [ 4 ]

3 голосов
/ 26 октября 2011

Проверка длины связана с тем, что самое короткое разумное имя файла представляет собой один символ, за которым следует .py, что дает как минимум 4 символа.

Последние проверки, похоже, пытаются захватить скомпилированные файлы с расширениями .pyc и .pyo, но это совершенно не нужно, поскольку они не будут соответствовать условию f[-2:] == "py".

. Для разбиения имени файла на корень и расширение вы также можете рассмотреть возможность использования os.path.splitext.

[root for (root, ext) in map(os.path.splitext, os.listdir(path)) if ext == '.py']
2 голосов
/ 26 октября 2011

Я бы предложил

[f[:-3] for f in glob.iglob("*.py")]

как краткая альтернатива данному коду.

1 голос
/ 26 октября 2011

Эта строка возвращает все файлы в каталоге, длина которых не менее 4 символов, не заканчивается на o или c, а заканчивается py. Он отсекает остаток от файлов, поэтому blubber.py будет преобразован в blubber. Я предлагаю следующее решение :

[x[:-3] for x in os.listdir('.') if x.endswith(".py")]
0 голосов
/ 26 октября 2011

f[-1] - последний элемент итерируемого, в данном случае, последняя буква f

Это, вероятно, было бы яснее:

[name for name, ext in [f.rsplit('.', 1) for f in os.listdir('.')] if ext == 'py']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...