循环停留在最后一个条目python

时间:2018-07-04 11:00:10

标签: python json loops

我正在读取文件,我想将数据追加到数组中,然后将其转储到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"
  },

有人知道发生了什么事吗?

预先感谢

3 个答案:

答案 0 :(得分:4)

这样做

contact = {
    "id":"",
    "email":""
}
在循环的

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

一种解决方案是在循环内 定义它或创建 copy

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]

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

答案 1 :(得分: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)

答案 2 :(得分:1)

您可以执行深度复制。

  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)