如何在Python中从平面文件中读取单个属性来动态生成类实例?

时间:2012-05-14 12:19:04

标签: python oop

如果已经提出这个问题,我道歉。

我是Python编程的新手,我需要做的是: 我有一个.csv文件,其中每行代表一个人,每列代表一个变量。 这个.csv文件来自我已经完成的基于代理的C ++模拟。 现在,我需要读取这个文件的每一行,并为每一行生成一个Person()类的新实例,逐行传递每个变量的参数。

我的问题是:在保留其唯一ID(这是我想从文件中读取的属性之一)的同时生成这些代理的最pythonic方法是什么?您是否建议创建用于访问每个实例的类字典?但是我仍然需要为每个实例提供一个名称,对吧?我怎么能动态地做到这一点?可能最好的方法是使用从文件读取的唯一ID作为实例名称,但我认为这些数字不能用作实例名称,它们可以吗?我想念指针! :(

我确信有一种我无法看到的pythonic解决方案,因为我仍然需要重新思考一下以pythonic的方式思考...... 非常感谢,任何帮助将不胜感激! 请记住,这是我在python中的第一个项目,所以请放轻松! ;)

编辑: 非常感谢您的回答,但我仍然没有得到答案:如何为我的csv文件中的每一行创建我的类Person()的实例。我想自动做!可能吗? 我为什么需要这个?因为我需要使用networkx创建这些人的网络,我希望在网络结构中链接“代理”,而不仅仅是字典项。

3 个答案:

答案 0 :(得分:3)

要阅读csv文件并从中生成dict文件,您应该明确地查看http://docs.python.org/library/csv.html#csv.DictReader

如果你有一个csv文件,其第一行是字段的名称和其余行的数据,DictReader将生成一个字典,将第一行中定义的字段名称作为键。举例来说,如果你给它以下csv文件:

Field1,Field2,Field3
1,2,3
4,5,6

它将返回以下列表:

[{'Field1':1,'Field2':2,'Field3':3} , {'Field1':4,'Field2':5,'Field3':6} ]

<强>增加:

关于基于字典创建实例,您应该看看以下内容:

Creating class instance properties from a dictionary in Python

或者从以下link获取,您可以执行以下操作:

class Person:
    def __init__(self, **kwds):
        self.__dict__.update(kwds)

# that's it!  Now, you can create a Bunch
# whenever you want to group a few variables:

person = Person(field1=1, field2=2, field3=3)

您可以使用dictReader返回的字典的每个条目来创建新实例:

reader = csv.DictReader(open('yourfile.csv', 'rU'), delimiter=',')
entries = [Person(**entry) for entry in reader]

答案 1 :(得分:1)

  

我有一个.csv文件

你很幸运; CSV支持内置于csv模块。

  

您是否建议创建用于访问每个实例的类字典?

我不知道你认为“类字典”是什么意思。有课,还有字典。

  

但是我仍然需要为每个实例提供一个名称,对吧?我怎么能动态地做到这一点?可能最好的方法是使用从文件读取的唯一ID作为实例名称,但我认为这些数字不能用作实例名称,可以吗?

Numbers不能是实例名称,但它们当然可以是字典键。

你不想动态地创建“实例名称”(假设你正在考虑将每个实例都放在一个单独的变量中或类似的那样)。你想要一本字典。所以只需让ID成为密钥。

  

我想念指针! :(

我真的,老实说,无法想象你希望如何在这里提供帮助,而且我有多年的C ++经验。

答案 2 :(得分:0)

美好的一天。你可以这样做:

    >>> class person(object):
    ...     def __init__(self, name):
    ...             self.name = name
    ...
    >>> d = dict()
    >>> names = ['1','2','3','4','5']
    #fill dict with any value. for example with hash of name        
        >>> for name in names:      
    ...     d[person(name)] = hash(name)
    ...
    >>>
    >>> d
    {<__main__.person object at 0x000000000236BC18>: 1977051568, <__main__.person ob
    ject at 0x0000000002372198>: -1933914571, <__main__.person object at 0x000000000
    1E95FD0>: 2105051955, <__main__.person object at 0x0000000002372160>: -180591418
    8, <__main__.person object at 0x00000000023721D0>: -2061914958}
    >>>

    >>> for key in d.keys():
    ...     key.name
    ...
    '1'
    '4'
    '2'
    '5'
    '3'

现在我们有5个对象。