我是Python新手,我正在执行的任务是从特定目录下的.iris
(其中包含嵌套字典格式的列表)文件列表中提取特定键值。
我想提取特定的值并将其保存为一个新的.csv
文件,并对所有其他文件重复此操作。
下面是我的.iris
文件样本,我应该从中提取这些键('uid','enabled','login','name')
。
{"streamType":"user",
"uid":17182,
"enabled":true,
"login":"xyz",
"name":"abcdef",
"comment":"",
"authSms":"",
"email":"",
"phone":"",
"location":"",
"extraLdapOu":"",
"mand":997,
"global":{
"userAccount":"View",
"uid":"",
"retention":"No",
"enabled":"",
"messages":"Change"},
"grants":[{"mand":997,"role":1051,"passOnToSubMand":true}],
我正试图将.iris
文件转换为.json
并逐个读取文件,但不幸的是,我没有得到所需的确切输出。
我的代码(添加注释):
import os
import csv
path = ''
os.chdir(path)
# Read iris File
def read_iris_file(file_path):
with open(file_path, 'r') as f:
print(f.read())
# iterate through all files
for file in os.listdir():
# Check whether file is in iris format or not
if file.endswith(".iris"):
file_path = f"{path}{file}"
# call read iris file function
print(read_iris_file(file_path))
您的文件包含JSON格式的数据,因此我们可以使用内置的json
模块来解析它。迭代扩展特定的文件您可以使用pathlib.glob()
"*.iris"
与下一个模式。然后我们可以使用csv.DictWriter()
并将"ignore"
传递给extrasaction
参数,这将使DictWriter
忽略我们不需要的键,只写我们传递给fieldnames
参数的键。
代码:
import csv
import json
from pathlib import Path
path = Path(r"path/to/folder")
keys = "uid", "enabled", "login", "name"
with open(path / "result.csv", "w", newline="") as out_f:
writer = csv.DictWriter(out_f, fieldnames=keys, extrasaction='ignore')
writer.writeheader()
for file in path.glob("*.iris"):
with open(file) as inp_f:
data = json.load(inp_f)
writer.writerow(data)
尝试以下操作(这里的关键是使用ast加载虹膜文件)
import ast
fields = ('uid','enabled','login','name')
with open('my.iris') as f1:
data = ast.literal_eval(f1.read())
with open('my.csv','w') as f2:
f2.write(','.join(fields) + 'n')
f2.write(','.join(data[f] for f in fields) + 'n')
my.csv
uid,enabled,login,name
17182,true,xyz,abcdef