API请求从字典到CSV,逐行Python

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

这适用于我下面的问题!如果有人能帮助我,有没有更好的方法来阅读标题而不是硬编码。由于这是一个API调用,我认为请求头可以在API更新中更改为字段名

#
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文件,并具有正确的标题。不要把行数记下来!谢谢你的帮助,一旦我有足够的分数,我会投票给这个。