2014-01-08 57 views
2

我想編譯instance's attributes以編程方式從外部(.csv)文件導入數據。到目前爲止,我可以在一次手動執行一個實例。使用這個工作流程:如何以編程方式在Python中添加實例?

class RS: #the calss has the importer method and many attributes 
    ... 
#workflow starts here 
a=RS() #I create the instance 
a.importer('pathofthefile') #the importer method fills the attributes of the instance with the exeternal file 
#ends here and restart... 
b=RS() 
b.importer('path... 

我想以編程方式創建情況,並參照classimporter填補他們我。怎麼可以遍歷大量文件的過程?例如使用listdir從文件夾中導入所有文件? 我雖然是這樣創建的實例:

for i in 'abcd': 
    eval('%s=RS()' %(i)) 

當然,但似乎沒有工作..

回答

5

您不應該將它們讀入具有不同名稱的變量 - 您將如何使用變量?

取而代之的是,將它們讀入一個名稱爲的數據結構

讓我們把做一個實例,並導入到一個功能的實際過程:

def read_instance(filename): 
    instance = RS() 
    instance.importer(filename) 
    return instance 

然後你就可以例如做一個清單:

instances = [read_instance(filename) for filename in 'abcd'] 

print len(instances) # Prints 4 
print instance[0] # Prints the first 
print instance[1] # Prints the second, etc 

或字典:

instances = {filename: read_instance(filename) for filename in 'abcd'} 

print instances['c'] # Prints the instance corresponding to filename 'c' 
+0

+1我相信這是最好的答案(也解決了我和亞歷山大之間令人尷尬的重複問題:) :) – furins

+0

當然。我的回答只是爲了展示如何使用元編程。 Ofc,正確的解決方案是以上。 –

+0

是非常聰明,這解決了兩個問題,我想問另一個問題,以瞭解如何檢索創建的所有實例列表,但現在我不再需要它了... –

4

首先,只有eval涉及表達式。要使用您應該使用的語句exec

>>>exec 'print 1' 
1 

但是,這不是最好的方法。你的貓用globals訪問和更改全局變量:

>>>globals()['b'] = 1 
>>>b 
1 

因此,解決辦法可能是這樣的:

for var_name in 'abcd': 
    globals()[var_name] = RS() 
    globals()[var_name].importer('... 
+0

+1因爲你更快 – furins

2

這裏是我想做到這一點,利用globals()內置:

for i in 'abcd': 
    globals()[i] = RS() 
    globals()[i].importer('pathofthefile') 

添加一些不同的東西,以亞歷山大的回答:)我想強調,這種方法並不適用於locals(),應使用只讀取變量而不設置它們。

+0

ops。幾乎是亞歷山大的一個副本。 – furins

+0

發生這種情況)。我也無意中複製了你的帖子,對此抱歉。 –

+0

@AlexanderZhukov沒問題我都謝謝你們倆! –

相關問題