2017-05-01 18 views
1

私は信じられないほどのPandastableを使用して、csvファイルからjpeg exifデータを表示しようとしています。PandaTablesとExif - 必要に応じて列を追加する

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') 

私の問題は、各ファイルは、可変データフィールドを持っているということですのでIMG1:私はCSVファイルに書き込むし、次のコードでtk.buttonクリックでPandastableでインポート、exifreadでこれらのファイルを処理しています50個のフィールドを持つことができますが、img2は51個のフィールドを持つ可能性があります。これにより、次のエラーが発生します。

CParserError:データをトークン化するエラー。 Cエラー:13行目の50個のフィールドが見えます。

だから、img2に余分なデータフィールドがあると、それがテーブルに追加されます。

私は自分の辞書にすべてのデータフィールドのリストを作成しようとしましたが、exifreadが動作するため、これは多くのバリエーションがあります。これを他のファイルタイプにも拡張して、これを維持しにくくすることを望んでいます。

他の同様の質問のほとんどが回答として持っているので、私はこれらの列を無視したくありません。

これらの列をどのように追加することができますか?

答えて

1

以下は基本的な例です。私はあなたの最終的な出力が何であると思われるのか分かりません。 2つのデータフレームを1つに連結しようとしていますか?

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:またはdf[str(columns)] = df2[str(columns)]などとすることができます。

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が」をTkinterの上pandastableのためのデータフレームとして使用された:ここでは

+0

こんにちはMattR、お返事ありがとうございます。 Pandastableは何らかの理由でデータフレームの周りを動かすつもりはないので、私は明確にしようとします。 私はファイルを開くたびに、{'image_size': '1024x768' ....}のようなものをdictとして与えるモジュールexifreadで処理します。 これをcsvファイルに書きたいと思います。 pandastableモジュールを使用して表示します。私は別のファイルを開き、それを処理してそのCSVファイルに追加したいと思います。 残念ながら、img2にimg1より多くの列がある場合は、上記のエラーをスローします。ですから、もしpythonがimg2の中でもっと多くの列を検出するなら、idはそれらをCSVに追加するのが好きです。 – Retro

+0

辞書を['pandas.DataFrame.from_dict'](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.from_dict.html)、マージ/連結(いずれか適切です)新しいデータフレームと私の答えと同じロジックを使用します。それはまったく役に立ちますか? – MattR

+0

ありがとうMattR、あなたの提案は私に正しい方向を正確に指摘 - 私はそれをやり直してしまい、私がそれを管理した方法で私の答えを編集するでしょう。 もう一度おねがいします! – Retro

0

は私がMATTRのコメントの助けを借りて一緒にハッキング方法です。

+0

これは、この投稿に来る人が正しい字下げを使用するのを助けるでしょう:) – MattR

関連する問題