Я создаю JSON файл из веб-сервиса, которым я не могу управлять, и результат примерно такой:
{
"steps": [
{
"start_station": "TOYOCHO",
"end_station": "NIHOMBASHI",
"start_time": 1598317440.0,
"end_time": 1598317920.0,
"duration": 8,
"train_name": "Tokyo Metro Tozai Line Rapid\u00a0for\u00a0NAKANO",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
},
{
"start_station": "NIHOMBASHI",
"end_station": "OSHIAGE",
"start_time": 1598318340.0,
"end_time": 1598319000.0,
"duration": 11,
"train_name": "Toei Subway Asakusa Line\u00a0for\u00a0NARITA AIRPORT TERMINAL 1",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
},
{
"start_station": "OSHIAGE",
"end_station": "AOTO",
"start_time": 1598319120.0,
"end_time": 1598319420.0,
"duration": 5,
"train_name": "Line name change, train goes through",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
},
{
"start_station": "AOTO",
"end_station": "KEISEI-TAKASAGO",
"start_time": 1598319480.0,
"end_time": 1598319600.0,
"duration": 2,
"train_name": "Line name change, train goes through",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
},
{
"start_station": "KEISEI-TAKASAGO",
"end_station": "SHIBAMATA",
"start_time": 1598320080.0,
"end_time": 1598320260.0,
"duration": 3,
"train_name": "Keisei Kanamachi Line\u00a0for\u00a0KEISEI-KANAMACHI",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
}
Теперь я читаю это как словарь с simplejson
и мне нужно удалить все шаги, где train_name
означает «Смена названия линии, поезд проходит», но мне нужно учитывать тот факт, что они существуют.
Другими словами:
- Из окончательного результата не следует удалять записи "поезд проходит";
- Первая запись после"поезд проходит", должен иметь "start_station" поле изменено на предыдущую «конечную станцию» предыдущей записи «поезд проходит через».
- «конечная станция» до запись «поезд проходит» должна быть записана как « start_station "первой следующей не-" поезд проходит через "запись.
- Сделайте то же самое для" start_time "," end_time "
IOW, если я выведу измененный JSON, это то, что я должен ожидать:
{
"steps": [
{
"start_station": "TOYOCHO",
"end_station": "NIHOMBASHI",
"start_time": 1598317440.0,
"end_time": 1598317920.0,
"duration": 8,
"train_name": "Tokyo Metro Tozai Line Rapid\u00a0for\u00a0NAKANO",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
},
{
"start_station": "NIHOMBASHI",
"end_station": "KEISEI-TAKASAGO",
"start_time": 1598318340.0,
"end_time": 1598319600.0,
"duration": 11, # Will get recalculated
"train_name": "Toei Subway Asakusa Line\u00a0for\u00a0NARITA AIRPORT TERMINAL 1",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null,
}
{
"start_station": "KEISEI-TAKASAGO",
"end_station": "SHIBAMATA",
"start_time": 1598320080.0,
"end_time": 1598320260.0,
"duration": 3,
"train_name": "Keisei Kanamachi Line\u00a0for\u00a0KEISEI-KANAMACHI",
"is_transfer": false,
"start_track_number": null,
"end_track_number": null
}
Число "идет четверть ough "может быть чем угодно, поэтому я не могу ожидать конкретную c длину.
В настоящее время я повторяю запись за записью, так как мне нужно выполнить некоторую обработку:
import simplejson as json
with open("results.json", "r") as handle:
data = json.load(handle)
for step in data["steps"]:
# Process stuff
Поэтому я застрял, потому что заблудился, пытаясь отследить предыдущее " не go через "запись.
Есть ли нехакерское решение? Обратите внимание, что я также избегаю перебора словаря, если это необходимо. Чего я не могу сделать, так это изменить данные (я могу добавить поле к JSON, говоря, что это "go through", но не более того).
Также извиняюсь за, возможно, плохо сформулированный заголовок, но трудно описать в нескольких словах, что я имею в виду.