【问题标题】:Reading huge file and processing it读取大文件并处理它
【发布时间】:2015-09-26 22:21:22
【问题描述】:

我在一个文件中有几个字典列表如下

[1,{'a':1,'b':8,'c':15}]
[2,{'j':2,'k':10,'a':15}]
........................
........................

我有一个主字典,其中包含上述字典列表的所有键,格式如下 {0:'c', 1:'b', 2:'j', 3:'a', 4:'k'}

对于我想按如下方式处理字典的每一行 [1,{3:1,1:8,0:15}] [2,{2:2,4:10,3:15}]

这里的值与输入行的值相同。键将是主字典中与该值对应的键。

for list1elem in listofemail[1:]:
            d = {k: list1elem[v] for k,v in vocab_dic.items() if v in list1elem}
            print(d)

但我的文件包含大约 25000 行,主词典包含 25000 个单词,这花了很多时间。我还从 8 个目录中读取了这样的文件。所以我还有两个 for 循环

for dirpath, dirs, files in os.walk('email'):
   files = [fi for fi in files if not fi.startswith("kjjii")]
      for filename in fnmatch.filter(files, '*.txt'):
         with open(os.path.join(dirpath, filename)) as f:
          lines = f.read().splitlines()
         for list1elem in listofemail[1:]:
            d = {k: list1elem[v] for k,v in vocab_dic.items() if v in list1elem}
            print(d)

它运行了 15 分钟。需要帮助来优化它。

【问题讨论】:

  • 在这样令人困惑的帖子上你不会得到任何帮助,请尝试具体说明你想要实现的目标,通过发布一个示例而不是你脑海中的大图,你尝试了什么到目前为止,最后你可以发布大图问题,否则很难理解

标签: python file


【解决方案1】:

这是我能想到的最快的,不使用多处理。如果您使用的是 python3,则可以通过调用 d.items()(或 python2 中的 d.iteritems())来优化所有 d[k] 调用。

import os
import ast

master = {0:'c', 1:'b', 2:'j', 3:'a', 4:'k'}
masterev = {master[k]:k for k in master}

answer = {}
for dirpath, dirnames, fnames in os.walk('email'):
    for fname in fnames:
        if not fname.startswith('kijiji'): continue
        if not fname.endswith('.txt'): continue

        contents = []
        fpath = os.path.join(dirpath, fname)
        with open(fpath) as infile:
            for line in infile:
                L = ast.literal_eval(line.strip())
                for num, d in L:
                    contents.append([num, {masterev[k]:d[k] for k in d}])

        answer[fpath] = contents

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2016-07-17
    • 1970-01-01
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多