【问题标题】:Add item to list in txt file using json (python)使用json(python)将项目添加到txt文件中的列表
【发布时间】:2015-02-26 16:05:41
【问题描述】:

我最近才开始使用 python,对使用 json 将项目添加到文件中的列表有一些疑问。

我的 txt 文件包含以下字符串: [[1, 2, 3, 4], [5, 6, 7, 8]] 我想使用json 将项目添加到列表中。有没有办法在不加载文件的情况下做到这一点?

import json
testfile = open('testfile, 'a')
list3 = [9,10,11,12]
json.dump(list3, testfile)

这将导致 [[1,2,3,4], [5,6,7,8]][9,10,11,12] 但我想[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]] 写入文件。

我可以为此目的使用extend 吗? 如果我这样做会影响使用json.read 的读取速度吗? 我必须使用json,因为我每次添加的列表都很大。

希望任何人都可以帮助我。提前致谢!

【问题讨论】:

  • @mu 使用 json 库将整个文件读入内存的性能影响可能不会那么小。听起来 SecondLemon 可能正在使用一个非常大的 json 文件。如果您有 10GB 的 JSON 日志数据,将其读入内存可能不是一个可行的解决方案。

标签: python json list file add


【解决方案1】:

加载文件内容 -->> 对内容进行操作 -->> 再次转储文件内容。

  1. 读取文件内容。
  2. 通过返回列表的json.loads() 加载文件内容。
  3. 追加新列表。
  4. 保存转储文件json.dump()

代码:

import json
testfile = '/home/vivek/Desktop/input12.txt'

with open(testfile ) as fp:
    content = fp.read()

value = json.loads(content)

list3 = [9,10,11,12]
value.append(list3)

with open(testfile, "wb" ) as fp:
    json.dump(value, fp)

输出: 文件内容:

[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]

【讨论】:

  • 不错。与其他人非常相似,但对我来说更容易理解。我对“json.loads”感到困惑,因为我认为它已经打开了文件。据我了解,您现在只需打开文件。将其中的任何内容存储为“内容”,然后使用“son.loads”进行翻译。很高兴学到东西:)
【解决方案2】:

这取决于您是否需要在文件仍在修改时读取此数组。

我建议省略数组绑定器 '[ .... ]',这样您现在就有了一个类似 csv 的文件,您可以继续向其中写入数据。

如果必须加载成特定格式,可以编写一个简单的解析器重新构造所需的数组。

【讨论】:

    【解决方案3】:

    您无法在不加载文件的情况下修改文件中的 JSON。你必须这样做:

    import json
    
    with open('testfile', 'r') as f:
        json_list = json.loads(r.read())
    
    list3 = [9,10,11,12]
    json_list.append(list3)
    
    with open('testfile', 'w') as f:
        f.write(json.dumps(json_list))
    

    【讨论】:

      【解决方案4】:

      如果不读取文件,您将无法执行此操作,因为文件 IO 的追加模式总是将数据追加到文件末尾,这意味着您将始终将数据追加到结束数组括号之外。

      但是,如果您的目标是避免一次将整个文件读入内存,您可以使用增量解析器,或者使用纯 Python 编写自己的解析器,或者使用类似 Yajl-Py 的东西。

      【讨论】:

        【解决方案5】:

        首先您加载 json 并将其放入变量中。然后你要做的就是将 [9,10,11,12] 添加到列表变量中:

        list.append([9,10,11,12])
        

        然后用列表变量重写 json 文件

        【讨论】:

        • 是的,我知道这对我来说是最简单的方法。将不得不加载它。
        猜你喜欢
        • 2011-03-09
        • 2021-09-04
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多