【问题标题】:read every 25 line of a csv file and pass to list using python读取 csv 文件的每 25 行并使用 python 传递给列表
【发布时间】:2019-11-03 12:57:05
【问题描述】:

我想读取一个文件并将该文件的每 25 行转换为一个列表,也就是说,它应该有 4 个列表,每个列表有 25 个项目(对于一个文件的 100 行)。我无法获取此问题的代码。 输入文件看起来像这样,实际上它有 100 行:

{'PutRequest': {'Item': {'id': {'S': 'E1DBEAE3'}, 'value': {'M': {'result': {'N': u'0.0015'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': '31C6C'}, 'value': {'M': {'result': {'N': u'0.1129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': '59D40'}, 'value': {'M': {'result': {'N': u'0.00129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': 'A2A9'}, 'value': {'M': {'result': {'N': u'0.05129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}

另外,我想在每个列表的第一个元素和最后一个元素中分别添加和附加一个字符串,例如:

'{"test":[' and append string like: ']}'

在 prepend 和 append 之后,它应该类似于 3 的列表大小,例如:

{"test":[{'PutRequest': {'Item': {'id': {'S': 'E1DBEAE3'}, 'value': {'M': {'result': {'N': u'0.0015'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': '31C6C'}, 'value': {'M': {'result': {'N': u'0.1129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': '59D40'}, 'value': {'M': {'result': {'N': u'0.00129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}
{'PutRequest': {'Item': {'id': {'S': 'A2A9'}, 'value': {'M': {'result': {'N': u'0.05129'}, 'lastupdatedtime': {'S': '2019-06-20'}}}}}}]}

我试过这段代码:

from itertools import islice
list =[]
with open('output_of_json.json', 'r') as infile:
    lines_gen = islice(infile, 25)
    for line in lines_gen:
        list.append(line)

无法超过文件的前 25 行

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 你有没有尝试过?你到底卡在哪里了?
  • from itertools import islice list =[] with open(filename', 'r') as infile: lines_gen = islice(infile, 25) for line in lines_gen: list.append(line) 无法继续前 25 行 @G.Anderson @Mureinik
  • 请将您的代码放在已编辑的问题中,而不是在 cmets 中。
  • @shalini, islice(infile, 25) 将遍历文件的 first 25 行。它切掉这 25 行并对其进行迭代,因此难怪您无法越过前 25 行。

标签: python list csv reader


【解决方案1】:

这可以做成一个函数。从逻辑上讲,这是您想要的。你可以使用 enumerate 来清理它。

with open(filename,'r') as f:

    counter = 25
    iteration = -1
    out_dict = {}            

    for i in f.readlines():

        if counter == 25:

            if out_dict[iteration]:

                # append your list
                out_dict[iteration].append('string here')

            counter = 0
            iteration += 1

            # create new instance and pre-pend
            out_dict[iteration] = ['string here']

        out_dict[iteration].append(i)

【讨论】:

    【解决方案2】:

    查看itertools recipes中的grouper函数。

    import itertools
    
    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 itertools.zip_longest(*args, fillvalue=fillvalue)
    
    from itertools import islice
    list =[]
    with open('output_of_json.json', 'r') as infile:
        lines_gen = grouper(infile, 25, fillvalue='')
        for line in lines_gen:
            # whatever you want to do
    

    请注意,如果最后一行的行数少于 25 行,则该代码将用空行填充 25 行。

    【讨论】:

    • 您需要调用ast.literal_eval() 将行解析成字典。
    • @Barmar:我不确定提问者想要完成什么。我只是展示了如何将这些行分组为 25 行的块。但是感谢您的评论——我稍微更改了我的代码以使其更通用。
    • 问题的这一部分怎么样:另外,我想分别在每个列表的第一个元素和最后一个元素中添加和附加一个字符串,像
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    • 2019-04-04
    • 2021-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多