>source

나는 예제를 작업 중이지만 몇 가지 요점을 고수했습니다. 저는 파이썬 초보자이며 자신을 향상 시키려고 노력합니다. 나는 openweather api를 사용하고 그것으로부터 데이터를 얻은 다음 이러한 데이터를 csv 파일에 쓰려고합니다. 내 코드의 목적은 도시 이름이 포함 된 txt 파일을 입력하는 것입니다. 도시 이름, 국가 코드, 위도, 온도, 풍속, 풍향을 얻고 싶습니다. 그런 다음 csv 파일에 씁니다. txt 파일을 입력하거나 명령 줄에서 입력으로 데이터를 가져올 수 있지만 둘 다 수행 할 수는 없습니다. 또한 데이터를 csv 파일에 쓰고 싶습니다. 저 좀 도와 주 시겠어요? 콘솔에 쓸 수 있지만 csv 파일에 써야합니다. 하지만 내 json 객체를 csv로 변환 할 수 없습니다.

내 input.txt

Los Angeles
San Francisco
...

내 코드 :

import requests
from pprint import pprint
import csv
import pandas as pd
file = input("Input the filepath: ")
with open(file) as f:
    for line in f:
        line = line.strip()
        API_key = "MYAPIKEY"
        base_url = "http://api.openweathermap.org/data/2.5/weather?"
        headers = {'content-type': 'application/json'}
        city_name = line
       
        Final_url = base_url + "appid=" + API_key + "&q=" + city_name
        weather_data = requests.get(Final_url).json()
        print("\nCurrent Weather" + city_name + ":\n")
        weather_data = requests.get(Final_url, headers=headers)
        f = open('weather_data_file.csv', "w")
        f.write(weather_data.text)
        f.close()
        print(f)

편집 후 문제 :

The CSV file just contains the last city data and data is not in a proper form if I open with excel

출력되는 데이터 :

{"coord":{"lon":-122.42,"lat":37.77},"weather":[{"id":802,"main":"Clouds","description":"scattered clouds","icon":"03d"}],"base":"stations","main":{"temp":284.74,"feels_like":280.59,"temp_min":283.15,"temp_max":286.48,"pressure":1024,"humidity":76},"visibility":10000,"wind":{"speed":5.1,"deg":260},"clouds":{"all":40},"dt":1609003065,"sys":{"type":1,"id":5817,"country":"US","sunrise":1608996226,"sunset":1609030632},"timezone":-28800,"id":5391959,"name":"San Francisco","cod":200}

  • 답변 # 1

    JSON (JavaScript Object Notation)은 데이터의 직렬화 된 표현입니다. pandas.read_json JSON을 디코딩하고 여기에서 데이터 프레임을 구축하려고합니다. 데이터를 읽은 후 requests 그리고 그것을 파이썬으로 역 직렬화했습니다. .json() 더 이상 JSON이 아닙니다. pandas.read_json 작동하지 않습니다.

    때로는 python 객체에서 직접 데이터 프레임을 빌드 할 수 있지만이 경우 추가 문제가 있습니다. 한 번에 하나의 데이터 행 (하나의 도시) 만 요청하고 해당 정보는 여러 사전에 중첩됩니다. Python을 사용하여 수신 된 도시 데이터를 원하는 데이터의 하위 집합으로 평면화 할 수 있습니다. 그리고 어쨌든 행 단위로만 작업하기 때문에 csv 모듈을 사용하여 행을 작성하십시오.

    해결책은

    import requests
    from pprint import pprint
    import csv
    openweathermap_city_csv_header = ["City Name", "Country Code", "Lat", "Long", "Temperature",
        "Wind Speed", "Wind Direction"]
    def openweathermap_city_flatten_record(record):
        coord = record["coord"]
        wind = record["wind"]
        return { "City Name":record["name"], 
            "Country Code":record["Code"],
            "Lat":coord["lat"],
            "Long":coord["lon"],
            "Temperature":record["main"]["temp"],
            "Wind Speed":wind["speed"],
            "Wind Direction":wind["deg"] }
        
    file = input("Input the filepath: ")
    with open(file) as cities, open('weather_data_file.csv', "w") as outfile:
        writer = csv.DictWriter(outfile, openweathermap_city_csv_header)
        for line in f:
            line = line.strip()
            API_key = "MYAPIKEY"
            base_url = "http://api.openweathermap.org/data/2.5/weather?"
            headers = {'content-type': 'application/json'}
            city_name = line
            Final_url = base_url + "appid=" + API_key + "&q=" + city_name
            weather_data = requests.get(Final_url, headers=headers).json()
            print("\nCurrent Weather" + city_name + ":\n")
            writer.writerow(openweathermap_city_flatten_record(weather_data))
    
    

  • 답변 # 2

    JSON 파일을 CSV 파일에 쓰려면 :

    import pandas as pd
    if __name__ == "__main__":
        df = pd.read_json (r'ajsonfile.json')
        df.to_csv (r'filename.csv', index = None)
    
    

    API에서 JSON 데이터를 작성하려면 :

    # Get JSON Data
    weather_data = requests.get(yourURL, headers=yourHeaders)
    # Write to .CSV
    f = open('weather_data_file.csv', "w")
    f.write(weather_data.text)
    f.close()
    
    

  • 이전 javascript - 생성자의 덮어 쓴 속성
  • 다음 python - vaex - n 단계 씩 열 이동