API请求从字典到CSV,逐行Python
这适用于我下面的问题!如果有人能帮助我,有没有更好的方法来阅读标题而不是硬编码。由于这是一个API调用,我认为请求头可以在API更新中更改为字段名API请求从字典到CSV,逐行Python,python,csv,dictionary,Python,Csv,Dictionary,这适用于我下面的问题!如果有人能帮助我,有没有更好的方法来阅读标题而不是硬编码。由于这是一个API调用,我认为请求头可以在API更新中更改为字段名 # class Csv: def __init__(self, JSONDict): self.JSONDict= JSONDict def json2csv(self): try: with open('test' + '.csv', 'w', newline='') as
#
class Csv:
def __init__(self, JSONDict):
self.JSONDict= JSONDict
def json2csv(self):
try:
with open('test' + '.csv', 'w', newline='') as csv_file:
fieldnames=['icao_address', 'timestamp', 'latitude', "longitude", "altitude_baro", "heading",
"ground_speed", "vertical_rate",'squawk_code' ,"on_ground", "callsign", "tail_number", "collection_type",
"flight_number", "origin_airport_iata", "destination_airport_iata"]
csv_writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
csv_writer.writeheader()
for key in self.JSONDict:
for item in key:
csv_writer.writerow(key)
except json.decoder.JSONDecodeError:
pass
在API请求的返回对象中,我还有5000个这样的对象,因此这是一个示例
{
"target": {
"icao_address": "0C208E",
"timestamp": "2020-02-14T17:58:32Z",
"latitude": -6.016251,
"longitude": -60.300743,
"altitude_baro": 36000,
"heading": 300.0,
"ground_speed": 480.0,
"vertical_rate": 0,
"on_ground": false,
"callsign": "CMP215",
"tail_number": "HP-1831CMP",
"collection_type": "terrestrial",
"flight_number": "CM215",
"origin_airport_iata": "GIG",
"destination_airport_iata": "PTY"
}
}{
"target": {
"icao_address": "345042",
"timestamp": "2020-02-14T17:58:35Z",
"latitude": 43.70636,
"longitude": 1.31352,
"altitude_baro": 36000,
"heading": 350.0,
"ground_speed": 460.0,
"vertical_rate": 0,
"on_ground": false,
"callsign": "VLG83WG",
"tail_number": "EC-MHB",
"collection_type": "terrestrial",
"flight_number": "VY8306",
"origin_airport_iata": "BCN",
"destination_airport_iata": "AMS"
}
}{
"target": {
"icao_address": "0200FB",
"timestamp": "2020-02-14T17:58:35Z",
"latitude": 38.503961,
"longitude": -2.120789,
"altitude_baro": 35000,
"heading": 230.0,
"ground_speed": 440.0,
"vertical_rate": 0,
"squawk_code": "5764",
"on_ground": false,
"callsign": "RAM931G",
"tail_number": "CN-RGK",
"collection_type": "terrestrial",
"flight_number": "AT931",
"origin_airport_iata": "GVA",
"destination_airport_iata": "CMN"
}
}{
"target": {
"icao_address": "E07246",
"timestamp": "2020-02-14T17:58:37Z",
"latitude": 40.860528,
"longitude": 9.897371,
"altitude_baro": 28475,
"heading": 240.0,
"ground_speed": 470.0,
"vertical_rate": 640,
"on_ground": false,
"callsign": "ARG1141",
"tail_number": "LV-GIF",
"collection_type": "terrestrial",
"flight_number": "AR1141",
"origin_airport_iata": "FCO",
"destination_airport_iata": "EZE"
}
}{
"target": {
"icao_address": "AD1C11",
"timestamp": "2020-02-14T17:58:37Z",
"latitude": 40.209449,
"longitude": -76.836631,
"altitude_baro": 34000,
"heading": 240.0,
"ground_speed": 330.0,
"on_ground": false,
"callsign": "AAL1382",
"tail_number": "N944AN",
"collection_type": "terrestrial",
"flight_number": "AA1382",
"origin_airport_iata": "EWR",
"destination_airport_iata": "DFW"
}
}
你很接近。由于您已经有了一个dicts列表,您可以在大部分工作中使用
csv.DictWriter.writerows
。您只需从每个目录中拉出“target”
子字典。我把你的数据删减了一点作为例子
import csv
data = [{
"target": {
"icao_address": "0C208E",
"timestamp": "2020-02-14T17:58:32Z",
"latitude": -6.016251,
"longitude": -60.300743,
}
},{
"target": {
"icao_address": "345042",
"timestamp": "2020-02-14T17:58:35Z",
"latitude": 43.70636,
"longitude": 1.31352,
}
},{
"target": {
"icao_address": "0200FB",
"timestamp": "2020-02-14T17:58:35Z",
"latitude": 38.503961,
"longitude": -2.120789,
}
}
]
fieldnames = ["icao_address", "timestamp", "latitude", "longitude"]
with open("test.csv", "w", newline="") as csv_f:
csv_writer = csv.DictWriter(csv_f, cols)
csv_writer.writeheader()
csv_writer.writerows(datum["target"] for datum in data)
print(open("test.csv").read())
csv.DictWriter
是一个可能的候选人。数据是否在msg
中?是否有一组已知的键/值对要保存?是的,我是否应该将ms['target']的内容附加到一个列表中,然后在其中循环。附加标题,然后是行。通常,您会边写边写csv。只有在有理由决定不写文件的情况下,才查看中间列表。顺便说一句,我认为您不需要global
声明。函数可以使用模块命名空间中的现有全局变量,而无需任何声明。只有当函数在模块命名空间中创建变量时,全局变量才有用。例如,在FILENAME的情况下,您显然希望在调用此函数之前变量存在。我让它工作了!嗨,tdelaney,我更新了我的代码(我无法让你的代码处理原始的请求读取),但是我创建了一个新类来表示它。我还附加了一个JSON结构,并打印出了我的终端。我仍然无法让它将任何内容打印到csv文件中。感谢您的更新(仅隔离到csv位非常好!),但仍然不清楚您的json是什么样子。您显示一个包含单个“目标”dict的dict。您得到一个键,然后对其执行for循环,即迭代“t”、“a”、“r”,。。。也许是另一个具有真实json结构的更新,但在一个我可以复制和执行的工作示例中,每个dict只显示几个字段。这件事的细节很重要!更新了我的代码和词汇表示例。它位于一个列表中,所以这就是我第一次尝试循环的原因。我还将它与我更新的代码一起输出到一个CSV文件,并具有正确的标题。不要把行数记下来!谢谢你的帮助,一旦我有足够的分数,我会投票给这个。