读取大文件并进行处理

时间:2015-09-26 22:21:22

标签: python file

我在文件

中列出的字典列表如下
[1,{'a':1,'b':8,'c':15}]
[2,{'j':2,'k':10,'a':15}]
........................
........................

我有一个主词典,其中包含以下格式的上述词典列表的所有键 {0:' c',1:' b',2:' j',3:' a',4:&#39 ; 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分钟。需要帮助来优化它。

1 个答案:

答案 0 :(得分:0)

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

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