Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Pandataables和Exif-根据需要添加列_Python_Csv_Pandas - Fatal编程技术网

Python Pandataables和Exif-根据需要添加列

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

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

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,你的建议为我指明了正确的方向-我最终重做了它,并将以我处理它的方式编辑我的答案。再次感谢!这将有助于其他人使用正确的缩进:)