Tôi có một thư mục chứa 100k tệp văn bản. Tôi muốn đặt các tập tin với hơn 20 dòng trong một thư mục khác. Làm thế nào để làm điều này trong python? Tôi đã sử dụng os.listdir, nhưng tất nhiên, không đủ bộ nhớ để tải các tên tập tin vào bộ nhớ. Có cách nào để lấy 100 tên tập tin cùng một lúc không?Lọc tệp trong một thư mục rất lớn
Dưới đây là mã của tôi:
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
Và Output:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
Dưới đây là kịch bản biến đổi:
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
nó hoạt động trên một thư mục với các file ít hơn, nhưng với sự lớn thư mục, tất cả nó in là "0" ... Hoạt động trên máy chủ Linux, in 0 trên máy Mac ... ồ ...
"không đủ bộ nhớ để tải các tên tệp vào bộ nhớ" Thật không? 100K tên tập tin không thực sự là tất cả những gì nhiều bộ nhớ. lỗi gì bạn nhận được? Bạn có thể đăng đoạn mã không? –
Tại sao bộ nhớ là vấn đề? 100k tệp có tên, giả sử 10 ký tự, là 10^7 byte = 10 megabyte, không quá lớn. –
Tôi đồng ý rằng OOM là lạ. Điều gì xảy ra nếu bạn nhập 'filenames = os.listdir ('/ somedir/labels /')' tại REPL? –