熊猫表和Exif-根据需要添加列

2024-10-06 08:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我尝试使用令人难以置信的Pandastable来显示csv文件中的jpeg-exif数据。我正在用exifrad处理这些文件,将其写入csv,然后用Pandastable在计算机上导入tk.按钮单击以下代码:

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可能有50个字段,而img2可能有51个字段。这将引发以下错误:

cparserror:标记数据时出错。C错误:第13行中预期有50个字段,saw 51

所以我想做的是,如果img2有额外的数据字段,它会将这些字段添加到表中。你知道吗

我试着先在自己的字典中创建一个所有数据字段的列表,但是由于exifrad的工作方式,这似乎不太好用,因为标签有很多不同的变体-我还希望将其扩展到其他文件类型,这将使其难以维护。你知道吗

我也不想忽略这些专栏,因为大多数其他类似的问题都有答案。你知道吗

你知道我该如何快速添加这些列吗?你知道吗


Tags: 文件csv数据错误filesopenfnamefile
2条回答

以下是我如何借助马特的评论将其破解的:

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的数据帧。你知道吗

下面是一个基本的例子。我不确定你的最终结果是什么。你想把两个数据帧合并成一个吗?你知道吗

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

编辑:或者你可以做df[str(columns)] = df2[str(columns)]或者类似的事情。你知道吗

相关问题 更多 >