python - 过滤超大文件夹中的文件

标签 python file-io

我有一个包含 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/

相关文章:

python - self.request.form 不可迭代?

python - 如何将提取的数据保存到文本文件

python - 从无服务器文件夹外部导入自制的 Python 模块

java - 扫描仪 - 线程 "main"java.util.NoSuchElementException : No line found 中出现异常

java - FileReader 读取文本文件时出错

c# - 重命名文件自己打开

matlab - 如何在不显示的情况下编辑保存在 .fig 文件中的图形的属性

python - 如何在 x 轴上设置日期刻度标签,仅适用于 matplotlib 上的给定点

python - Python正则表达式删除空格并在空格所在的位置大写字母?

java - 将大量 XML(文件对象)转换为包含所有文件内容的单个字符串