如果已经提出这个问题,我道歉。
我是Python编程的新手,我需要做的是: 我有一个.csv文件,其中每行代表一个人,每列代表一个变量。 这个.csv文件来自我已经完成的基于代理的C ++模拟。 现在,我需要读取这个文件的每一行,并为每一行生成一个Person()类的新实例,逐行传递每个变量的参数。
我的问题是:在保留其唯一ID(这是我想从文件中读取的属性之一)的同时生成这些代理的最pythonic方法是什么?您是否建议创建用于访问每个实例的类字典?但是我仍然需要为每个实例提供一个名称,对吧?我怎么能动态地做到这一点?可能最好的方法是使用从文件读取的唯一ID作为实例名称,但我认为这些数字不能用作实例名称,它们可以吗?我想念指针! :(
我确信有一种我无法看到的pythonic解决方案,因为我仍然需要重新思考一下以pythonic的方式思考...... 非常感谢,任何帮助将不胜感激! 请记住,这是我在python中的第一个项目,所以请放轻松! ;)
编辑: 非常感谢您的回答,但我仍然没有得到答案:如何为我的csv文件中的每一行创建我的类Person()的实例。我想自动做!可能吗? 我为什么需要这个?因为我需要使用networkx创建这些人的网络,我希望在网络结构中链接“代理”,而不仅仅是字典项。
答案 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个对象。