2014-01-08 2 views
2

프로그래밍 방식으로 외부 (.csv) 파일에서 데이터를 가져 오는 instance's attributes을 컴파일하려고합니다. 지금까지는 한 번에 하나의 인스턴스를 수동으로 수행 할 수 있습니다.프로그래밍 방식으로 인스턴스를 파이썬에 추가하는 방법은 무엇입니까?

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을 사용 하시겠습니까? 인스턴스를 생성하기위한이 같은 I하지만 뭔가 :

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

그러나 물론

가 작동하지 않는 것 같습니다 .. eval 거래만을 표현과 함께 모든

답변

5

다른 이름의 변수로 읽으면 안됩니다. 변수를 어떻게 사용 하시겠습니까?

대신 데이터 구조으로 읽습니다.

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' 

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

이 그럼 당신은 예를 들어 목록을 만들 수 있습니다

의 인스턴스를 만들고 함수로 가져 오기의 실제 과정을 넣어 보자

+0

+1 나는 이것이 최고의 대답이라고 믿는다. (또한 나와 알렉산더 사이의 당혹스럽고 중복되는 문제를 해결한다.) – furins

+0

물론입니다. 내 대답은 메타 프로그래밍을 사용하는 방법을 보여주기위한 것이었다. Ofc, 올바른 해결책은 위와 같습니다. –

+0

네, 매우 똑똑해서 두 가지 문제를 해결했습니다. 나는 만들어지는 모든 인스턴스의 목록을 검색하는 방법을 이해하는 또 다른 질문을하길 원했지만 지금은 더 이상 필요하지 않습니다. –

4

첫째,. 문을 사용하려면 exec :

을 사용해야합니다. 그러나이 방법이 최선의 방법은 아닙니다.

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

그래서 해결책은 다음과 같습니다 : 당신은 고양이 글로벌 변수에 접근하고 변경 globals를 사용

여기
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

작전입니다. 거의 알렉산더 대작의 복제본. – furins

+0

그럴 수 있습니다). 나는 또한 실수로 귀하의 게시물을 복제했습니다. 죄송합니다. –

+0

@AlexanderZhukov 문제 없습니다. 둘 다 감사합니다! –

관련 문제