Python27如何批量读取字典来执行命令

时间:2016-07-22 06:13:55

标签: python csv parsing dictionary

我只需要帮助了解如何一次使用 X 行。

我有一个解析10000行csv文件的任务 - >将其转换为字典 - >然后一次处理100行进行API调用。对于此示例,我们只需输出到 打印 功能。我将需要每100或更少执行一次,因为一些嵌套字典将不会完全达到每个100,因此代码需要灵活。我使用python2.7没有像美丽的sup等花哨的额外模块。我得到了 api_worker 的循环代码块来帮助我完成这项任务,但不知道如何让它工作。我在哪里放置打印件(稍后用api代码替换)?我到目前为止所尝试的一切都打印了所有,没有或每个字符串。

生病了很多不必要的代码:

import *  # assume i have all the right modules

    def parseCSV(filename):
        # this i have working
        return result

    def api_worker(readerObj):
        for majorkey in readerObj.keys():
            listof100 = []
            for idx, line in enumerate(readerObj.get(majorkey)):
                if (idx+1 % 100) != 0:
                    listof100.append(line)
                else:
                    print listof100  #tried here makes no difference
                    del listof100[:]
                    listof100.append(line)
                print listof100  #tried here but outputs all

    def main():
        readerObj = parseCSV('somefile.csv')
        api_worker(readerObj)

    if __name__ == '__main__':
        main()

示例来源:

{'majorkey1': [{'name':'j','age':'3','height':'6feet'},
 {'name':'r','age':'4','height':'5feet'},
 {'name':'o','age':'5','height':'3feet'}],
 'majorkey2':[{'name':'n','age':'6','height':'4feet'},
 {'name':'s','age':'7','height':'7feet'},
 {'name':'q','age':'7','height':'8feet'}]}

所需的输出:

如果使用这个小样本,我想一次打印2行,打印所需的输出将是:

来自majorkey1群组的

{'name':'j','age':'3','height':'6feet'}{'name':'r','age':'4','height':'5feet'}

睡1秒......

{'name':'o','age':'5','height':'3feet'}
来自majorkey2组的

睡1秒......

{'name':'n','age':'6','height':'4feet'}{'name':'s','age':'7','height':'7feet'}

睡1秒......

{'name':'q','age':'7','height':'8feet'}

非常感谢帮助。

2 个答案:

答案 0 :(得分:0)

听起来你需要将列表拆分成固定长度的块,而不将整个列表加载到内存中?使用itertools模块的一些帮助可以实现这一点。这取自Python docs

from itertools import izip_longest

def grouper(iterable, n, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

答案 1 :(得分:0)

一种可能性:

from itertools import islice

d = {
        'majorkey1': [
            { 'name':'j','age':'3','height':'6feet' },
            { 'name':'r','age':'4','height':'5feet' },
            { 'name':'o','age':'5','height':'3feet' },
        ],
        'majorkey2': [
            { 'name':'n','age':'6','height':'4feet' },
            { 'name':'s','age':'7','height':'7feet' },
            { 'name':'q','age':'7','height':'8feet' },
        ],
}

n = 2

for k, v in d.items():
    print '{}:'.format(k)
    it = iter(v)
    while True:
        rows = list(islice(it, n))
        if len(rows) == 0:
            break
        print '\t{}'.format(rows)

# Output:
# majorkey1:
#   [{'age': '3', 'name': 'j', 'height': '6feet'}, {'age': '4', 'name': 'r', 'height': '5feet'}]
#   [{'age': '5', 'name': 'o', 'height': '3feet'}]
# majorkey2:
#   [{'age': '6', 'name': 'n', 'height': '4feet'}, {'age': '7', 'name': 's', 'height': '7feet'}]
#   [{'age': '7', 'name': 'q', 'height': '8feet'}]

(顺便说一句,如果你真的想要上面给出的格式,你可以用print替换那个列表print ''.join(map(repr, rows)),当然你可以在任何地方插入一个睡眠。)