0

如果这个问题已经被问过,我很抱歉。

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

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

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

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

4

3 回答 3

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} ]

添加:

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

在 Python 中从字典创建类实例属性

或从以下链接获取,您可以执行以下操作:

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]
于 2012-05-14T12:26:41.777 回答
1

我有一个 .csv 文件

你很幸运;csvCSV 支持是通过模块内置的。

您是否建议创建一个类字典来访问每个实例?

我不知道您认为“类词典”是什么意思。有类,有字典。

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

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

无论如何,您都不想动态创建“实例名称”(假设您正在考虑将每个实例名称放在单独的变量中或类似的东西中)。你想要一本字典。所以让 ID 成为键。

我想念指针!:(

老实说,我真的无法想象您希望指针如何提供帮助,而且我在 C++ 方面有多年的经验。

于 2012-05-14T12:56:21.283 回答
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 个对象。

于 2012-05-14T12:36:12.150 回答