2014-06-06 4 views
1

У меня есть приложение Python, которое вставляет словарные записи в MongoDB (через PyMongo).Python - Присвоить тип значению в словаре

Записи словаря считываются из строк файла CSV (его фактически разделение на вкладке, но такое же различие).

Чтобы прочитать файл CSV и вставить каждую строку в MongoDB, я использую код:

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 = [] 

Это работает очень хорошо, за исключением того, что ВСЕ мои значения имеют тип string, когда на самом деле, У меня есть int и float значения в записях. I think У Python есть возможность определить тип, но я не уверен, как реализовать это в приведенном выше коде. Кто-нибудь об этом знает?

UPDATE:

Оба sihrc и Joran «ы ответ указал мне правильное направление. Тем не менее, я хотел обновить с полной рабочей реализацией. Мой вопрос включал, как я могу изменить состав каждого элемента словаря, прежде чем отправить его в 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

Вы пытаетесь прочитать тип вашего входного файла? Вы можете попробовать кастинг в try catch. – sihrc

+0

Полагаю, мне может понадобиться, но об этом я и спрашиваю. – Brett

ответ

1

sihrc почти имеет решение

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

вам нужно сделать это в таком порядке

так float("1") обрушит штраф и вернуть поплавок (в другом растворе), даже если его на самом деле a 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

Смежные вопросы