Một lựa chọn được danh sách tất cả các file trong một thư mục với os.listdir và sau đó tìm kiếm chỉ những kết thúc bằng '.json':
import os, json
import pandas as pd
path_to_json = 'somedir/'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
print(json_files) # for me this prints ['foo.json']
Bây giờ bạn có thể sử dụng gấu trúc DataFrame.from_dict để đọc trong json (một cuốn từ điển python vào thời điểm này) cho một dataframe gấu trúc:
montreal_json = pd.DataFrame.from_dict(many_jsons[0])
print montreal_json['features'][0]['geometry']
Prints:
{u'type': u'Point', u'coordinates': [-73.6051013, 45.5115944]}
Trong trường hợp này tôi đã nối thêm một số jsons vào danh sách many_jsons
. Các json đầu tiên trong danh sách của tôi thực sự là một geojson với một số dữ liệu địa lý về Montreal. Tôi đã quen thuộc với nội dung nên tôi đã in ra 'hình học' mang lại cho tôi những lon/lat của Montreal.
Các mã sau đây tóm tắt tất cả mọi thứ trên:
import os, json
import pandas as pd
# this finds our json files
path_to_json = 'json/'
json_files = [pos_json for pos_json in os.listdir(path_to_json) if pos_json.endswith('.json')]
# here I define my pandas Dataframe with the columns I want to get from the json
jsons_data = pd.DataFrame(columns=['country', 'city', 'long/lat'])
# we need both the json and an index number so use enumerate()
for index, js in enumerate(json_files):
with open(os.path.join(path_to_json, js)) as json_file:
json_text = json.load(json_file)
# here you need to know the layout of your json and each json has to have
# the same structure (obviously not the structure I have here)
country = json_text['features'][0]['properties']['country']
city = json_text['features'][0]['properties']['name']
lonlat = json_text['features'][0]['geometry']['coordinates']
# here I push a list of data into a pandas DataFrame at row given by 'index'
jsons_data.loc[index] = [country, city, lonlat]
# now that we have the pertinent json data in our DataFrame let's look at it
print(jsons_data)
cho tôi bản in này:
country city long/lat
0 Canada Montreal city [-73.6051013, 45.5115944]
1 Canada Toronto [-79.3849008, 43.6529206]
Có thể hữu ích để biết rằng đối với mã này tôi có hai geojsons trong một tên thư mục ' json '. Mỗi json có cấu trúc sau:
{"features":
[{"properties":
{"osm_key":"boundary","extent":
[-73.9729016,45.7047897,-73.4734865,45.4100756],
"name":"Montreal city","state":"Quebec","osm_id":1634158,
"osm_type":"R","osm_value":"administrative","country":"Canada"},
"type":"Feature","geometry":
{"type":"Point","coordinates":
[-73.6051013,45.5115944]}}],
"type":"FeatureCollection"}
Thực sự hữu ích. Thay vì in ý tưởng của tôi là để lưu tất cả chúng vào một khung dữ liệu gấu trúc, nên những gì sẽ là mã chính xác? tạo một khung dữ liệu trống và bắt đầu thêm hàng vào nó? Cảm ơn @Scott cho câu trả lời chi tiết này! – donpresente
@donpresente Câu hỏi hay. Tôi sẽ đăng chỉnh sửa để giải quyết cách lấy một số dữ liệu mong muốn từ một json và sau đó đẩy dữ liệu này vào một DataFrame gấu trúc, theo hàng. – Scott
@donpresente đã làm mã dưới ** EDIT ** giúp bạn? – Scott