Python Pandataables和Exif-根据需要添加列
所以我尝试使用令人难以置信的Pandastable来显示来自csv文件的jpeg exif数据。我正在使用exifread处理这些文件,将其写入csv,然后使用tk上的Pandastable导入。单击按钮并使用以下代码:Python Pandataables和Exif-根据需要添加列,python,csv,pandas,Python,Csv,Pandas,所以我尝试使用令人难以置信的Pandastable来显示来自csv文件的jpeg exif数据。我正在使用exifread处理这些文件,将其写入csv,然后使用tk上的Pandastable导入。单击按钮并使用以下代码: def load_file(): fname = askopenfilename(filetypes=(("JPEG/TIFF files", "*.jpg;*.tiff"), ("All files
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个字段。这会引发以下错误:
CParserError:标记数据时出错。C错误:第13行预计有50个字段,SAW51
所以我想做的是,如果img2有额外的数据字段,它会将这些字段添加到表中
我曾尝试在我自己的字典中首先创建一个所有数据字段的列表,但由于Exifrad的工作方式,这似乎不起作用,因为标签有很多不同的变体-我还希望将其扩展到其他文件类型,这将使其难以维护
我也不想忽略这些专栏,因为大多数其他类似的问题都有答案
你知道我如何快速添加这些列吗?下面是一个基本示例。我不确定你的最终输出应该是什么。您是否正在尝试将两个数据帧合并为一个
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)]
或者诸如此类的事情。以下是我在马特评论的帮助下对其进行黑客攻击的方式:
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的数据帧。嗨,MattR,谢谢您的回答。由于某种原因,PandaTable看起来无法处理数据帧,因此我将尝试澄清。基本上,每次我打开一个文件,我都会用exifread模块处理它,它会给我一个类似{'image_size':'1024x768'..}的命令。我想把它写入一个csv文件,然后用pandastable模块显示它。然后我想打开另一个文件,处理它并将其添加到该csv。不幸的是,如果img2的列数比img1的多,就会抛出上面的错误。因此,如果python在img2中检测到更多的列,我想将它们添加到CSV中。您可以在中读取字典,合并/合并新的数据帧(以适当的为准),并使用与我的答案相同的逻辑。这有帮助吗?很难想出一个具体的例子而不看到你在看什么Hanks MattR,你的建议为我指明了正确的方向-我最终重做了它,并将以我处理它的方式编辑我的答案。再次感谢!这将有助于其他人使用正确的缩进:)