【问题标题】:Dumping JSON data straight into a text file?将 JSON 数据直接转储到文本文件中?
【发布时间】:2019-10-30 13:08:59
【问题描述】:

目前,我无法将从其他客户端软件接收到的数据写入文件,该文件将在每次转储后追加并添加空格。我尝试了很多不同的方法,但现在我只剩下这个了,我有点难过。

目前我无法再写入文件,我不确定我做了什么来破坏我的那部分代码。

while True:
    data = s.recv(1024).decode('utf-8')
    if data:
        with open("data.txt", 'w') as f:
            json.dump(data, f, ensure_ascii=False)

我希望每次收到新数据时都会出现一个不会被覆盖的文件,从而允许我开发我的应用程序的搜索和表格功能。

【问题讨论】:

  • 你用'w'打开文件,写,它总是启动一个新文件。用'a'打开它以进行附加。
  • 或者只是在while循环之外打开文件,一直保持打开状态,完成后关闭。
  • 另请注意,如果您像这样将多个 JSON 对象转储到单个文件中,遵循标准的 JSON 解析器(例如 Python)将无法读取它。
  • 如果你接收的是JSON数据,你不需要再用json.dump编码;只需将data 直接写入文件即可。

标签: python json python-3.x


【解决方案1】:

您当前对每个区块所做的工作:

  1. 将块解码为 UTF
  2. 打开文件,截断之前的内容('w' 模式)
  3. 重新编码数据
  4. 转储到文件中

为什么这是一种不好的方法:

  1. 您的块不一定会遵守 UTF 代码点边界。您需要在解码之前积累所有数据。
  2. 您不仅使用'w' 而不是'a' 模式来截断现有文件,而且一遍又一遍地打开和关闭文件效率非常低,通常是个坏主意。
  3. 如果原始块超出 UTF 边界,您将不会得到相同的结果。最坏的情况是,您的整个数据集都将是垃圾。
  4. 您无法结束流。您可能希望最终关闭文件并对其进行解码。

你应该怎么做:

  1. 打开输出文件(二进制模式)
  2. 循环直到流结束
  3. 将所有原始二进制数据包转储到文件中
  4. 关闭文件
  5. 读取文件时解码文件

示例代码:

with open('data.txt', 'wb') as file:
    while True:
        data = s.recv(1024)
        if not data:
            break
        file.write(data)

如果二进制流包含 UTF-8 编码的 JSON 数据,这就是您将在文件中获得的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-08
    • 2018-05-25
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 2022-12-16
    相关资源
    最近更新 更多