0

使用 Python 2.6,我正在尝试处理越来越多的格式(xls、csv、shp、json、xml、html 表数据)的表,并将内容输入到 ArcGIS 数据库表中(请留在我身边,这是更多关于过程的python部分而不是GIS部分)。在当前设计中,我的基类格式化目标数据库表并使用源格式的内容填充它。子类目前设计用于将内容输入字典,以便基类可以处理内容,无论源格式是什么。

问题是我的用户可能会将这些格式中的任何一种格式的文件或表格输入到脚本中,因此子类将在运行时最佳地确定。除了运行一个真正涉及的 if-elif-elif-... 块之外,我不知道如何做到这一点。结构看起来像这样:

class Input:
  def __init__(self, name): # name is the filename, including path
    self.name = name
    self.ext = name[3:]
    d = {} # content goes here
    ... # dictionary content written to database table here

# each subclass writes to d
class xls(Input):
  ...

class xml(Input):
  ...

class csv(Input):
  ...

x = Input("c:\foo.xls")
y = Input("c:\bar.xml")

我对鸭子类型和多态性的理解表明这不是解决问题的方法,但我很难找到更好的设计。这方面的帮助会有所帮助,但我真正想要的是如何转换x.exty.ext转换为确定子类(以及输入处理)的分叉。

如果有帮助,假设foo.xlsbar.xml具有相同的数据,因此x.dy.d最终将具有相同的项目,例如{'name':'Somegrad', 'lat':52.91025, 'lon':47.88267}.

4

3 回答 3

1

这个问题通常通过了解子类的工厂函数来解决。

input_implementations = { 'xls':xls, 'xml':xml, 'csv':csv }

def input_factory(filename):
    ext = os.path.splitext(filename)[1][1:].lower()
    impl = input_implementations.get(ext, None)
    if impl is None:
        print 'rain fire from the skies'
    else:
        return impl(filename)

从基类本身 (Input('file.xyz')) 更难做到这一点,因为在定义 Input 时没有定义子类。你可能会变得棘手,但一个简单的工厂很容易。

于 2013-08-14T23:24:24.410 回答
0

如果每个派生类都包含一个它可以解析的可能的文件扩展名列表呢?然后,您可以尝试将输入文件的扩展名与其中之一匹配,以决定使用哪个子类。

于 2013-08-14T23:01:09.013 回答
0

你在正确的轨道上。使用你的子类:

x = xls("c:\foo.xls")
y = xml("c:\bar.xml")

在每个子类中编写方法来解析相应的数据类型,并使用基类(Input)将数据写入数据库。

于 2013-08-14T23:01:15.417 回答