Как я могу перечислить содержимое каталога в Python?

188

Не может быть сложно, но у меня психическое расстройство.

Пол Д. Уэйт
источник

Ответы:

52

В одну сторону:

import os
os.listdir("/home/username/www/")

Другой способ :

glob.glob("/home/username/www/*")

Примеры найдены здесь .

glob.globВыше метод не будет список скрытых файлов.

Так как я первоначально ответил на этот вопрос несколько лет назад, pathlib был добавлен в Python. Мой предпочтительный способ перечисления каталога теперь обычно включает iterdirметод для Pathобъектов:

from pathlib import Path
print(*Path("/home/username/www/").iterdir(), sep="\n")
Трей Ханнер
источник
Будет ли glob.glob перечислять скрытые файлы (я предполагаю, что вы имеете .XYZв виду файлы в контексте файловой системы Unix), когда используется с glob.glob("/home/username/www/.*")?
Энди Финкенштадт
Да, я имею в виду файлы, начинающиеся с точки. Приведенный вами пример будет работать для сопоставления скрытых файлов (и только скрытых файлов).
Трей Ханнер
Я только что импортировал glob и использовал glob.glob (r'c: \ users '), но он только вернулся['c:\\users']
Musixauce3000
1
@ Musixauce3000: Вы захотите это сделать glob.glob(r'c:\users\*')(глобус, на самом деле он не перечисляет каталоги, но расширяет звездочки и тому подобное, что выполняет аналогичную задачу).
Трей Ханнер
38

os.walk можно использовать, если вам нужна рекурсия:

import os
start_path = '.' # current directory
for path,dirs,files in os.walk(start_path):
    for filename in files:
        print os.path.join(path,filename)
Марк Толонен
источник
18

glob.globили os.listdirсделаю это.

Туомас Пелконен
источник
import globENTER glob.glob(r'c:\users')ENTER только кажется, чтобы вернуться ['c:\\users']. Это почему? Я хотел бы использовать glob.glob, потому что, как отмечали другие пользователи, он предположительно возвращает содержимое каталога, а также игнорирует скрытые файлы. Это важно.
Musixauce3000
потому что вы должны указать подстановочный знак с glob:glob.glob(r'c:\users\*')
Жан-Франсуа Фабр
14

В osмодуле ручки все прочее.

os.listdir(path)

Вернуть список, содержащий имена записей в каталоге, заданных путем. Список в произвольном порядке. Он не включает специальные записи "." и «..», даже если они присутствуют в каталоге.

Доступность: Unix, Windows.

zdav
источник
4

В Python 3.4+ вы можете использовать новый pathlibпакет:

from pathlib import Path
for path in Path('.').iterdir():
    print(path)

Path.iterdir()возвращает итератор, который можно легко превратить в list:

contents = list(Path('.').iterdir())
jpyams
источник
3

Начиная с Python 3.5, вы можете использовать os.scandir.

Разница в том, что он возвращает записи файлов, а не имена. В некоторых ОС, таких как Windows, это означает, что вам не нужно os.path.isdir/fileзнать, является ли это файл или нет, и это экономит процессорное время, потому что statэто уже сделано при сканировании директории в Windows:

Пример для вывода каталога и печати файлов размером больше max_valueбайтов:

for dentry in os.scandir("/path/to/dir"):
    if dentry.stat().st_size > max_value:
       print("{} is biiiig".format(dentry.name))

(прочитайте обширный мой ответ на основе производительности здесь )

Жан-Франсуа Фабр
источник
2

Ниже приведен список каталогов и файлов в каталоге. Другой - os.walk

def print_directory_contents(sPath):
        import os                                       
        for sChild in os.listdir(sPath):                
            sChildPath = os.path.join(sPath,sChild)
            if os.path.isdir(sChildPath):
                print_directory_contents(sChildPath)
            else:
                print(sChildPath)
Хинашри Хандельвал
источник