2017-05-01 1 views
1

Also versuche ich die unglaubliche Pandastable zu verwenden, um JPEG-Exif-Daten aus einer CSV-Datei anzuzeigen. Ich bin der Verarbeitung dieser Dateien mit exifread, es in eine CSV schreiben und dann mit Pandastable auf einem tk.button klicken Sie den folgenden Code zu importieren:PandaTables und Exif - Hinzufügen von Spalten nach Bedarf

def load_file(): 
fname = askopenfilename(filetypes=(("JPEG/TIFF files", "*.jpg;*.tiff"), 
             ("All files", "*.*"))) 
f = open(fname,'r') 

fdata.update(exifread.process_file(f, details=False)) 

with open('tempdata.csv', 'a') as f: 
    w = csv.DictWriter(f, fdata.keys(),extrasaction="raise") 
    w.writeheader() 
    w.writerow(fdata) 

datatable.importCSV('tempdata.csv') 

Mein Problem ist, dass jede Datei variable Datenfelder, so img1 könnte 50 Felder haben, während img2 51 Felder haben könnte. Das gibt den folgenden Fehler aus:

CParserError: Fehler beim Token von Daten. C-Fehler: Erwartete 50 Felder in Zeile 13, sah 51

Also was ich gerne tun würde, ist, dass, wenn img2 zusätzliche Datenfelder hat, fügt sie diese in die Tabelle.

Ich habe versucht, eine Liste aller Datenfelder zuerst in meinem eigenen Wörterbuch zu erstellen, aber aufgrund der Art, wie Exifread funktioniert, scheint dies nicht gut zu funktionieren, da es viele, viele verschiedene Variationen von Tags gibt - I Ich hoffe auch, dies auf andere Dateitypen zu erweitern, die dies schwer zu pflegen machen würden.

Ich möchte diese Spalten auch nicht einfach ignorieren, da die meisten der anderen ähnlichen Fragen als Antwort haben.

Irgendwelche Ideen, wie ich diese Spalten im laufenden Betrieb hinzufügen könnte?

Antwort

1

Unten ist ein grundlegendes Beispiel. Ich bin mir nicht sicher, was deine endgültige Ausgabe sein soll. Versuchen Sie, die beiden Datenrahmen zu einem zusammenzufassen?

import pandas as pd 
import numpy as np 
df = pd.DataFrame({'A' : [1,1,3,4,5,5,3,1,5,np.NaN], 
        'B' : [1,np.NaN,3,5,0,0,np.NaN,9,0,5], 
        'C' : ['AA1233445','AA1233445', 'rmacy','Idaho Rx','Ab123455','TV192837','RX','Ohio Drugs','RX12345','USA Pharma'], 
        'D' : [123456,123456,1234567,12345678,12345,12345,12345678,123456789,1234567,np.NaN], 
        'E' : ['Assign','Unassign','Assign','Ugly','Appreciate','Undo','Assign','Unicycle','Assign','Unicorn',]}) 
print(df) 

df2 = pd.DataFrame({'Z' : [9,8,7,6,5,4,3,2,1,0] }) 

# if the column in df2 is not in df, create a column in df 
# I'm just setting it to 0 in the example, but you could fill it with whatever for your case 

for columns in df2.columns.tolist(): 
    if columns not in df.columns.tolist(): 
     df[str(columns)] = 0 

EDIT: oder Sie könnten so df[str(columns)] = df2[str(columns)] oder etwas tun.

+0

Hallo MatR, danke für die Antwort. Pandastable scheint aus irgendeinem Grund nicht um die Datenrahmen herum zu arbeiten, also werde ich versuchen, dies zu klären. Grundsätzlich jedes Mal, wenn ich eine Datei öffne, verarbeite ich es mit dem Modul exifread, das mir ein dict von Sachen wie {'image_size': '1024x768' ....} Ich möchte dies in eine CSV-Datei schreiben und Zeigen Sie es dann mit dem Pandastable-Modul an. Ich möchte dann eine andere Datei öffnen, sie verarbeiten und sie dem CSV hinzufügen. Wenn img2 mehr Spalten als img1 hat, wird leider der obige Fehler angezeigt. Wenn also Python mehr Spalten in img2 findet, fügt id diese in die CSV ein. – Retro

+0

Sie könnten die Wörterbücher mit ['pandas.DataFrame.from_dict'] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html), Merge/Concat (was auch immer ist der neue Datenrahmen und verwenden Sie die gleiche Logik wie in meiner Antwort. Hilft das überhaupt? Es ist schwer, ein konkretes Beispiel zu finden, ohne zu sehen, was du siehst. – MattR

+0

Danke MattR, deine Vorschläge haben mich genau in die richtige Richtung gelenkt - ich habe es am Ende neu geschrieben und werde meine Antwort so bearbeiten, wie ich es geschafft habe. Danke nochmal! – Retro

0

Hier ist, wie ich es zusammen mit der Hilfe von MattR Kommentare gehackt:

def load_file(): 
    global header_set, df 
    fname = askopenfilename(filetypes=(("JPEG/TIFF files", "*.jpg;*.tiff"), 
             ("All files", "*.*"))) 
    f = open(fname,'r') 

    fdata.update(exifread.process_file(f, details=False)) 

    df2 = pd.DataFrame.from_records(fdata, index=[0]) 
    print df2 
    df = df.append(df2, ignore_index=True) 
    print df 
    pd.DataFrame.to_csv(df,path_or_buf='tempdata.csv', index=False) 

    datatable.importCSV('tempdata.csv') 
    datatable.redraw() 

‚df‘ dann als Datenrahmen für pandastable auf tkinter verwendet wurde.

+0

Es würde anderen helfen, zu diesem Beitrag zu kommen, um den richtigen Einzug zu verwenden :) – MattR

Verwandte Themen