Tengo una carpeta con 100k archivos de texto. Quiero poner archivos con más de 20 líneas en otra carpeta. ¿Cómo hago esto en Python? Usé os.listdir, pero por supuesto, no hay suficiente memoria para cargar los nombres de archivos en la memoria. ¿Hay alguna manera de obtener tal vez 100 nombres de archivo a la vez?Filtrar archivos en una carpeta muy grande
Aquí está mi código:
import os
import shutil
dir = '/somedir/'
def file_len(fname):
f = open(fname,'r')
for i, l in enumerate(f):
pass
f.close()
return i + 1
filenames = os.listdir(dir+'labels/')
i = 0
for filename in filenames:
flen = file_len(dir+'labels/'+filename)
print flen
if flen > 15:
i = i+1
shutil.copyfile(dir+'originals/'+filename[:-5], dir+'filteredOrigs/'+filename[:-5])
print i
y de salida:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
del script modificado Aquí:
import os
import shutil
import glob
topdir = '/somedir'
def filelen(fname, many):
f = open(fname,'r')
for i, l in enumerate(f):
if i > many:
f.close()
return True
f.close()
return False
path = os.path.join(topdir, 'labels', '*')
i=0
for filename in glob.iglob(path):
print filename
if filelen(filename,5):
i += 1
print i
funciona en una carpeta con un menor número de archivos, pero con la mayor carpeta, todo lo que imprime es "0" ... Funciona en el servidor Linux, imprime 0 en mac ... oh bien ...
"no hay suficiente memoria para cargar los nombres de archivos en la memoria" ¿De verdad? 100K nombres de archivo no es realmente tanta memoria. ¿Qué error estás recibiendo? ¿Puedes publicar el fragmento de código? –
¿Por qué la memoria es un problema? 100k archivos con nombres de, digamos, 10 caracteres cada uno, son 10^7 bytes = 10 megabytes, realmente no demasiado grandes. –
Estoy de acuerdo en que un OOM es extraño. ¿Qué sucede si ingresas 'filenames = os.listdir ('/ somedir/labels /')' en REPL? –