Ich habe einen Ordner mit 100k Textdateien. Ich möchte Dateien mit mehr als 20 Zeilen in einen anderen Ordner legen. Wie mache ich das in Python? Ich habe os.listdir benutzt, aber natürlich ist nicht genug Speicher vorhanden, um die Dateinamen in den Speicher zu laden. Gibt es eine Möglichkeit, um vielleicht 100 Dateinamen gleichzeitig zu erhalten?Filterdateien in einem sehr großen Ordner
Hier ist mein Code:
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
und Ausgang:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
Hier ist das modifizierte Skript:
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
es funktioniert auf einem Ordner mit weniger Dateien, aber mit dem größeren Ordner, alles, was es druckt ist "0" ... Funktioniert auf Linux-Server, druckt 0 auf Mac ... oh well ...
"Es ist nicht genug Speicher vorhanden, um die Dateinamen in den Speicher zu laden" Wirklich? 100K Dateinamen sind nicht wirklich viel Speicher. Welchen Fehler bekommst du? Können Sie den Codeschnipsel posten? –
Warum ist Speicher ein Problem? 100k Dateien mit Namen von zB 10 Zeichen sind 10^7 Bytes = 10 Megabyte, nicht wirklich groß. –
Ich stimme zu, dass ein OOM seltsam ist. Was passiert, wenn Sie 'filenames = os.listdir ('/ somedir/labels /')' an der REPL eingeben? –