【问题标题】:Loop stuck to last entry python循环卡在最后一个条目 python
【发布时间】:2018-12-12 19:13:41
【问题描述】:

我正在读取一个文件,我想将数据附加到一个数组中,然后将其转储到 json 文件中。我正在使用 python 2.7。

问题是它只返回文件的最后一行并用它填充文件。 不知道是不是清楚所以我给个代码

import re
import json

results = []
contact = {
    "id":"",
    "email":""
}


source = open('zen_id.txt')
output = open('zen_id_js.json', 'w')
for line in source:
    email = re.search(r'[\w\.-]+@[\w\.-]+', line)
    contact['email'] = email.group(0)
    p = re.search(r'\d\d\d\d\d', line)
    contact['id'] = p.group(0)
    results.append(contact)

json.dump(results, output)

输出是:

[
  {
    "id": "35148",
    "email": "****@gmail.com"
  },
  {
    "id": "35148",
    "email": "****@gmail.com"
  },
  {
    "id": "35148",
    "email": "****@gmail.com"
  },
  {
    "id": "35148",
    "email": "****@gmail.com"
  },

有人知道发生了什么吗?

提前致谢

【问题讨论】:

  • 定义contact = { "id":"", "email":"" } inside循环。否则引用将被重用。经典
  • 让它成为答案@Jean-FrançoisFabre
  • 非常感谢!傻我...
  • 我试图找到一个重复的,但我找不到(我敢肯定有很多但我很难找到它......)
  • 顺便说一句,我们可以用\d{5}替换嘈杂的\d\d\d\d\d

标签: python json loops


【解决方案1】:

通过做

contact = {
    "id":"",
    "email":""
}

在循环之外,你有一个对象的实例。您只需一遍又一遍地修改同一个实例(result.append 不会创建字典的副本,只存储引用)

一种解决方案是在循环内部定义它或创建一个副本

for line in source:
    email = re.search(r'[\w\.-]+@[\w\.-]+', line)
    contact = {}  # create a new, empty instance
    contact['email'] = email.group(0)
    ...

请注意,没有必要使用键和空值来定义字典,因为无论如何您都会覆盖它们。将其定义为空。

另一种选择是根本不使用contact,并在附加到列表时使用文字形式即时创建字典:

results.append({"email":email.group(0), "id":p.group(0)})

您也可以完全跳过循环并使用列表理解将其写在一行中:

results = [{"email":re.search(r'[\w\.-]+@[\w\.-]+', line).group(0), "id":re.search(r'\d\d\d\d\d', line).group(0)} for line in source]

这里唯一的问题是您无法处理不匹配的情况,至少是轻松处理。

【讨论】:

  • 非常感谢您的详细解答!
【解决方案2】:

您必须在 for 循环中添加联系人字典。

import re
import json

results = []



source = open('zen_id.txt')
output = open('zen_id_js.json', 'w')
for line in source:
    contact = {
        "id": "",
        "email": ""
    }
    email = re.search(r'[\w\.-]+@[\w\.-]+', line)
    contact['email'] = email.group(0)
    p = re.search(r'\d\d\d\d\d', line)
    contact['id'] = p.group(0)
    results.append(contact)

json.dump(results, output)

【讨论】:

    【解决方案3】:

    您可以执行深度复制。

      import re
      import json
      import copy
    
      results = []
      contact = {
          "id":"",
          "email":""
      }
    
    
      source = open('zen_id.txt')
      output = open('zen_id_js.json', 'w')
      for line in source:
          email = re.search(r'[\w\.-]+@[\w\.-]+', line)
          contact['email'] = email.group(0)
          p = re.search(r'\d\d\d\d\d', line)
          contact['id'] = p.group(0)
          results.append(copy.deepcopy(contact))
    
      json.dump(results, output)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-16
      • 2019-04-05
      • 1970-01-01
      • 2015-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多