Ho una cartella con file di testo 100k. Voglio mettere file con oltre 20 linee in un'altra cartella. Come lo faccio in Python? Ho usato os.listdir, ma ovviamente non c'è abbastanza memoria per caricare anche i nomi dei file in memoria. C'è un modo per ottenere forse 100 nomi di file alla volta?Filtra i file in una cartella molto grande
Ecco il mio codice:
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
e di uscita:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
Ecco lo script modificato:
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
funziona su una cartella con un minor numero di file, ma con la più grande cartella, tutto ciò che stampa è "0" ... Funziona su server linux, stampa 0 su mac ... oh beh ...
"non c'è abbastanza memoria per caricare anche i nomi dei file in memoria" Davvero? I nomi di file 100K non sono poi così tanta memoria. Che errore stai ottenendo? Puoi pubblicare lo snippet di codice? –
Perché la memoria è un problema? File 100k con nomi di, ad esempio, 10 caratteri ciascuno, è 10^7 byte = 10 megabyte, non troppo grandi in realtà. –
Sono d'accordo che una OOM è strana. Cosa succede se inserisci 'filenames = os.listdir ('/ somedir/labels /')' al REPL? –