La forma correcta de evitar la asignación de la lista de nombres usando os.listdir es usar la función de nivel de os como dijo @Charles Duffy.
inspirado en este otro mensaje: List files in a folder as a stream to begin process immediately
que añade la forma de resolver la cuestión OP específica y se utiliza la versión reentrante de la función.
from ctypes import CDLL, c_char_p, c_int, c_long, c_ushort, c_byte, c_char, Structure, POINTER, byref, cast, sizeof, get_errno
from ctypes.util import find_library
class c_dir(Structure):
"""Opaque type for directory entries, corresponds to struct DIR"""
pass
class c_dirent(Structure):
"""Directory entry"""
# FIXME not sure these are the exactly correct types!
_fields_ = (
('d_ino', c_long), # inode number
('d_off', c_long), # offset to the next dirent
('d_reclen', c_ushort), # length of this record
('d_type', c_byte), # type of file; not supported by all file system types
('d_name', c_char * 4096) # filename
)
c_dirent_p = POINTER(c_dirent)
c_dirent_pp = POINTER(c_dirent_p)
c_dir_p = POINTER(c_dir)
c_lib = CDLL(find_library("c"))
opendir = c_lib.opendir
opendir.argtypes = [c_char_p]
opendir.restype = c_dir_p
readdir_r = c_lib.readdir_r
readdir_r.argtypes = [c_dir_p, c_dirent_p, c_dirent_pp]
readdir_r.restype = c_int
closedir = c_lib.closedir
closedir.argtypes = [c_dir_p]
closedir.restype = c_int
import errno
def listdirx(path):
"""
A generator to return the names of files in the directory passed in
"""
dir_p = opendir(path)
if not dir_p:
raise IOError()
entry_p = cast(c_lib.malloc(sizeof(c_dirent)), c_dirent_p)
try:
while True:
res = readdir_r(dir_p, entry_p, byref(entry_p))
if res:
raise IOError()
if not entry_p:
break
name = entry_p.contents.d_name
if name not in (".", ".."):
yield name
finally:
if dir_p:
closedir(dir_p)
if entry_p:
c_lib.free(entry_p)
if __name__ == '__main__':
import sys
path = sys.argv[1]
max_per_dir = int(sys.argv[2])
for idx, entry in enumerate(listdirx(path)):
if idx >= max_per_dir:
break
print entry
¿Hay algo distinto acerca de los nombres de directorio que contienen secuencias de imágenes DPX? –
Si desea leer grandes directorios de forma incremental (es decir, no solo detener la recursión, pero ni siquiera leer sus contenidos individuales), es posible que necesite usar algo como las soluciones descritas en http: // stackoverflow.com/questions/4403598/list-files-in-a-folder-as-a-stream-to-begin-process-inmediatamente –
Algunos directorios tienen 'dpx' en el nombre, pero no todos ellos :(@charles, ¿ese ejemplo funciona para mí. Quiero salir de una lista si cruzo un DPX, de esta manera podría evitar iterar a través de 100.000 nombres de archivo, lo que lleva mucho tiempo. – Jamie