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

2024-10-17 08:28:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我只需要一次使用X行的帮助。

我有一个任务来解析一个10000行的csv文件->;将其转换为字典->;然后一次处理100行进行API调用。在本例中,让我们只输出到print函数。我将需要执行每100或更少的一些嵌套字典将不完全工作到100每个,所以代码将需要为此灵活。我使用的是python2.7,没有漂亮的sup等额外模块。我得到了api\u workerfor循环代码块来帮助我完成这项任务,但不知道如何让它工作。我应该把打印放在哪里(稍后用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'}]}

所需输出:

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

来自主要工作组

{'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'}

非常感谢你的帮助


Tags: csv代码namegtapiage字典main
2条回答

听起来你需要把一个列表分解成固定长度的块,而不把整个列表加载到内存中?这可以通过使用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)

一种可能性:

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 ''.join(map(repr, rows))替换列表print,当然你可以在任何你想要的地方插入一个sleep。)

相关问题 更多 >