我正在读取文件,我想将数据追加到数组中,然后将其转储到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"
},
有人知道发生了什么事吗?
预先感谢
答案 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)