С минимальными изменениями в вашем коде:
import json
import os
path = "E:/proj/Project tweets/2019_07_01/01/"
filelist = os.listdir(path)
for filename in filelist:
if filename.endswith(".json"):
with open(path + filename, 'r') as file:
lines = file.readlines()
for line in lines:
json_line = json.loads(line)
try:
tags = ["created_at", "text", "user_location"]
for i in json_line:
if i not in tags:
del json_line[i]
with open('out_01_01.json', 'w') as file:
file.write(json.dumps(json_line))
except ValueError:
continue
Однако ваш код можно улучшить несколькими способами.
Если строки могут быть повреждены:
import json
import os
path = 'E:/proj/Project tweets/2019_07_01/01'
filelist = [filex if filex.endswith('.json') for filex in os.listdir(path)]
tags = {'created_at', 'text', 'user_location'}
output = []
for filename in filelist:
with open(os.path.join(path, filename), 'r') as f:
lines = f.readlines()
for line in lines:
try:
json_line = json.loads(line)
except JSONDecodeError:
continue
output.append(dict((k, v) if k in tags for k, v in json_line.values()))
with open('out_01_01.json', 'a') as f:
json.dump(output, f)
В противном случае вы можете просто сделать:
import json
import os
path = 'E:/proj/Project tweets/2019_07_01/01'
filelist = [filex if filex.endswith('.json') for filex in os.listdir(path)]
tags = {'created_at', 'text', 'user_location'}
output = []
for filename in filelist:
output = [dict((k, v) if k in tags for k, v in json_line.values()) for json_line in (json.loads(l) for l in open(os.path.join(path, filename), 'r').readlines())]
with open('out_01_01.json', 'w') as f:
json.dump(output, f)
Проблема заключалась в том, что data
является JSON string в вашем примере, но вы, очевидно, предполагали, что data
будет диктатом. На самом деле, json_lines
- это диктат, и его лучше назвать json_line
.
Примечание: вы никогда не должны называть переменную file
, потому что файл является зарезервированным именем в Python. Кроме того, я не вижу, где ValueError может возникнуть в блоке try, но JSONDecodeError может появиться при вызове json.loads
.