2014-06-06 6 views
1

에 사전 레코드를 삽입하는 Python 응용 프로그램이 있습니다 (PyMongo 통해).Python - 사전의 값에 유형 지정

사전 레코드는 CSV 파일의 행 (실제로는 탭으로 구분되었지만 같은 차이)에서 읽습니다. 때 사실, 모든 내 값 유형 string의 것을 를 제외하고,이 아주 잘 작동

with open(input_file, 'r') as f_h: 
    reader = csv.DictReader(f_h, delimiter='\t') 
    records = [] 
    for record in reader: 
     records.append(record) 
     if len(records) % 100 == 0: 
      db.add_record(table_name, records) #MongoDB helper method 
      records = [] 

:

나는 코드를 사용하고는 CSV 파일을 읽고 MongoDB으로 각 행을 삽입하려면 나는 또한 intfloat 값을 가지고 있습니다. I 생각하다. 파이썬에는 형식을 결정하는 기능이 있지만 위 코드에서이를 구현하는 방법을 잘 모르겠습니다. 아무도 이것에 대해 어떤 생각을 가지고 있습니까?

는 UPDATE :

모두 sihrcJoran의 대답은 나에게 올바른 방향을 지적했다. 그러나, 전체 작업 구현으로 업데이트하고 싶었습니다. 내 질문에 MongoDB에 보내기 전에 어떻게 사전의 각 요소의 형변환을 변경하겠습니까? 이렇게하려면 사전에 각 key/value 쌍 이상의 루프에 코드를 넣어야했습니다.

for key, value in dictionary.iteritems(): 
     try: 
      dictionary[key] = int(value) 
     except: pass 
     try: 
      dictionary[key] = float(value) 
     except: pass 

    return dictionary 

지금은 매력처럼 작동합니다. 두 가지 대답을 받아 들일 수 있기를 바랍니다.

+0

input_file에서 유형을 읽으려고하십니까? 시도 캐치 안에 캐스팅 해 볼 수 있습니다 .. – sihrc

+0

내가해야 할 수도 있겠지만, 내가 여기서 물어 보는 것입니다. – Brett

답변

1

sihrc 거의 심지어는 실제로 불구하고

def convertType(value): 
    if value.strip().isdigit(): 
     return int(value) 
    try: 
     return float(value) 
    except: 
     pass  
    return value 

당신이 훌륭한 캐스팅 (다른 솔루션) float를 반환합니다

float("1") 때문에이 순서대로 수행에 필요한 솔루션을 제공합니다 int

더 짧게 만들 수 있습니다 (더 읽기 가능할 수도 있음)

def convertType(value): 
    try: 
     return int(value) if value.strip().isdigit() else float(value) 
    except: 
     return value # or None or float("-inf") or something depending on desired behavior 
1
with open(input_file, 'r') as f_h: 
    reader = csv.DictReader(f_h, delimiter='\t') 
    records = [] 
    for record in reader: 
     records.append(convertType(record)) 
     if len(records) % 100 == 0: 
      db.add_record(table_name, records) #MongoDB helper method 
      records = [] 

def convertType(value): 
    try: 
     return float(value) 
    except: pass 
    try: 
     return int(value) 
    except: 
     return value 
+1

+1 ... 그냥 시도 할 수 있습니다 : 변수를 반환하기 위해 할당하는 대신 return cast (value). .. 또한 논리가 약간 꺼져 있습니다. –

+0

맞습니다! 고마워, 간과. – sihrc

관련 문제