【问题标题】:Remove JSON object from file in Python从 Python 中的文件中删除 JSON 对象
【发布时间】:2019-01-10 19:44:21
【问题描述】:

我不确定我的 json 文件是否是唯一的,但我找不到任何其他有效的问题/答案。

我的 JSON 文件如下所示:

{"UserID": "name1", "Timestamp": "1234"}
{"UserID": "name2", "Timestamp": "4321"}
{"UserID": "name3", "Timestamp": "1234"}

有没有办法让python从文件中删除整行?

这是我到目前为止所做的:

open_file = open("times.json", 'r')
line = open_file.readline()

while line:
    jsonLine = json.loads(line)

    if line['Timestamp'] == '1234':
        del line

open_file.close()

如果时间戳是 1234,我希望它删除整个对象,所以文件看起来像这样:

{"UserID": "name2", "Timestamp": "4321"}

谢谢!

【问题讨论】:

  • 不是一个 JSON 文件。一般来说,从文件中删除一行并不简单——我建议阅读整个文件,在内存中修改它,然后再写回去。
  • @jonrsharpe 虽然它不完全是 JSON 文件,但它是正确的 JSON lines 格式。

标签: python json file


【解决方案1】:

结合 jonrsharpe 和 ajon 的建议,而不是在阅读时删除它,而是将其读入内存然后再写回。

但是,您可能更容易先阅读jsons,然后消除具有匹配元素的行,而不是直接处理文本:

json_lines = []
with open("times.json", 'r') as open_file:
    for line in open_file.readlines():
        j = json.loads(line)
        if not j['Timestamp'] == '1234':
            json_lines.append(line)

with open("times.json", 'w') as open_file:
    open_file.writelines('\n'.join(json_lines))

此方法在必要时为您提供了对多个键/值的更多条件灵活性,而不是专门在行内查找 "TimeStamp": "1234"

【讨论】:

  • 这正是我想要的。非常感谢。我不得不对其进行一些修改,但这是完美的。
  • 我稍微修改了答案以提供换行符。不要为每一行保存json 对象,因为您正在写回str,只需从一开始就保存line 并在之后执行'\n'.join(...)。请参阅我的更新答案。
  • 谢谢!你的回答很有帮助。
  • writelines 需要 sequence 行;如果您自己构建整个文件字符串,我认为它会将每个 character 写入一个新行。
  • @jonrsharpe 我刚刚再次阅读了文档,我以为我错过了一些东西,但没有,没有添加行分隔符,所以它在列表本身中是预期的。对我来说似乎毫无意义,因为在这种情况下,如果我使用writewritelines,我必须自己使用'\n'.join(json_lines)。但我同意,在这种情况下,如果我只使用 write() 可能会更好。
【解决方案2】:

正如@jonrsharpe 所建议的,您可以阅读该文件。做任何你想做的操作。然后重写文件。

这是一个例子:

test.out:

test file
#test comment
testfile

Python 代码:

content = ''
with open('test.out', 'r') as f:
  for line in f:
    if line.startswith('#'): continue # don't copy comment lines
    content += line

with open('test.out', 'w') as f:
  f.write(content)

test.out 之后:

test file
testfile

【讨论】:

    【解决方案3】:

    将整个文件读入内存可能会导致大文件出现问题。您可能希望写入临时文件,然后用新文件覆盖旧文件。为此在 python 库中有一个构建:https://docs.python.org/3/library/tempfile.html

    如果你确定,你的文件不大,不需要read_line你可以直接使用json.load()

    【讨论】:

    • 他们不能使用 json.load,因为该文件不包含单个 JSON 实体
    猜你喜欢
    • 2020-12-15
    • 2017-03-25
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多