Konwersja pliku CSV na JSON w Pythonie

2017-11-15 12:57

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

Chcę dokonać konwersji pliku w formacie CSV zawierającego takie linie:

111117_055958,b8:27:eb:da:ef:6d,0,b8:27:eb:8f:ba:38,192.168.1.10,171110_163200,19,0,0,562,18.7,50.1,ON,OFF,44.0,6593,3697,-2.700629,X,

na plik JSON o postaci:

[
    "Nazwa_1" : "Wartość_1"
    "Nazwa_2" : "Wartość_2"
    "Nazwa_3" : "Wartość_3"
    itd
]

Oto mój kod w Pythonie. Założeniem jest że działa to w pipeline stąd pobiera dane z stdin i wyrzuca na stdout Linie zahashowane to efekt moich prób

#!/usr/bin/env python
import csv, json , sys

fieldnames = ("Time","MAC_ETH","IP_ETH","MAC_WiFi","IP_WiFi","Up_time","Winsen","ADC_2","ADC_3","VOC","Temp","Humidity","Internet","Lampa_UV","CPU_temp","Amph_P1","Amph_P2","PT100","Brak")
reader = csv.DictReader(sys.stdin)

for row in reader:
    print(json.dumps(fieldnames, indent=19))
#    json.dump(row, sys.stdout)
#    sys.stdout.write(%s % row)
#    sys.stdout.write('\n')

Program wyświetla poprawnie nazwy parametrów ale nie wyświetla ich wartości. Jak poniżej:

[
                   "Time", 
                   "MAC_ETH", 
                   "IP_ETH", 
                   "MAC_WiFi", 
                   "IP_WiFi", 
                   "Up_time", 
                   "Winsen", 
                   "ADC_2", 
                   "ADC_3", 
                   "VOC", 
                   "Temp", 
                   "Humidity", 
                   "Internet", 
                   "Lampa_UV", 
                   "CPU_temp", 
                   "Amph_P1", 
                   "Amph_P2", 
                   "PT100", 
                   "Brak"
]

Co muszę zmienić w kodzie aby poszczególne linie miały taką postać jak w wcześniej przytoczonym przykładzie?
edytowany 1x, ostatnio: Piotr Mackowiak, 2017-11-15 13:57

Pozostało 580 znaków

2017-11-15 15:32
Moderator

Rejestracja: 17 lat temu

Ostatnio: 5 minut temu

0

fieldnames musisz mieć jako sekwencję, a masz jako tuple.

#!/usr/bin/env python
import csv, json,sys

fieldnames = ["Time","MAC_ETH","IP_ETH","MAC_WiFi","IP_WiFi","Up_time","Winsen","ADC_2","ADC_3","VOC","Temp","Humidity","Internet","Lampa_UV","CPU_temp","Amph_P1","Amph_P2","PT100","Brak"]
reader = csv.DictReader(sys.stdin, fieldnames)

for row in reader:
    json.dump(row, sys.stdout)

I dostaję:

E:\Marcin\Temp>python pp.py
111117_055958,b8:27:eb:da:ef:6d,0,b8:27:eb:8f:ba:38,192.168.1.10,171110_163200,19,0,0,562,18.7,50.1,ON,OFF,44.0,6593,3697,-2.700629,X
^Z
{"Time": "111117_055958", "MAC_ETH": "b8:27:eb:da:ef:6d", "IP_ETH": "0", "MAC_WiFi": "b8:27:eb:8f:ba:38", "IP_WiFi": "192.168.1.10", "Up_time": "171110_163200", "Winsen": "19", "ADC_2": "0", "ADC_3": "0", "VOC": "562", "Temp": "18.7", "Humidity": "50.1", "Internet": "ON", "Lampa_UV": "OFF", "CPU_temp": "44.0", "Amph_P1": "6593", "Amph_P2": "3697", "PT100": "-2.700629", "Brak": "X"}
E:\Marcin\Temp>

Pozostało 580 znaków

2017-11-15 16:24

Rejestracja: 2 lata temu

Ostatnio: 5 miesięcy temu

0

OK, jest poprawa. Teraz mój kod wygląda tak:

#!/usr/bin/env python
import csv, json , sys

fieldnames = ("Time","MAC_ETH","IP_ETH","MAC_WiFi","IP_WiFi","Up_time","Winsen","ADC_2","ADC_3","VOC","Temp","Humidity","Internet","Lampa_UV","CPU_temp","Amph_P1","Amph_P2","PT100","Brak",)
reader = csv.DictReader(sys.stdin, fieldnames)

for row in reader:
    print(json.dumps(row, sys.stdout))
    sys.stdout.write('\n')

W wyniku czego otrzymuję :

{"ADC_2": "0", "ADC_3": "0", "Up_time": "171110_163200", "MAC_WiFi": "b8:27:eb:8f:ba:38", "CPU_temp": "44.0", "Temp": "18.7", "VOC": "562", "PT100": "-2.700629", "MAC_ETH": "b8:27:eb:da:ef:6d", "Internet": "ON", "Winsen": "19", "Humidity": "50.1", "Amph_P2": "3697", "Amph_P1": "6593", "IP_ETH": "0", "null": [""], "Time": "111117_055958", "Brak": "X", "Lampa_UV": "OFF", "IP_WiFi": "192.168.1.10"}

Jak więc widać poszczególne parametry są co prawda poprawne ale nie zachowują kolejności jaka powinna być zgodnie z kolejnością w "fieldnames". Da się z tym coś zrobić?

Pozostało 580 znaków

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0