我有一个包含 100k 文本文件的文件夹。我想将超过 20 行的文件放在另一个文件夹中。我如何在 python 中执行此操作?我使用了 os.listdir,但是当然,没有足够的内存来加载文件名到内存中。有没有办法一次获取大约 100 个文件名?
这是我的代码:
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
和输出:
Traceback (most recent call last):
File "filterimage.py", line 13, in <module>
filenames = os.listdir(dir+'labels/')
OSError: [Errno 12] Cannot allocate memory: '/somedir/'
这是修改后的脚本:
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
它适用于文件较少的文件夹,但对于较大的文件夹,它只打印“0”... 在 linux 服务器上工作,在 mac 上打印 0...哦好吧...
最佳答案
您可以尝试使用 glob.iglob
返回一个迭代器:
topdir = os.path.join('/somedir', 'labels', '*')
for filename in glob.iglob(topdir):
if filelen(filename) > 15:
#do stuff
此外,请不要使用 dir
作为变量名:您正在隐藏内置变量。
您可以引入的另一个主要改进是您的 filelen
函数。如果将其替换为以下内容,您将节省大量时间。相信我,what you have now is the slowest alternative :
def many_line(fname, many=15):
for i, line in enumerate(open(fname)):
if i > many:
return True
return False
关于python - 过滤超大文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2177250/