Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python—将类型分配给字典中的值_Python_Mongodb_Pymongo - Fatal编程技术网

Python—将类型分配给字典中的值

Python—将类型分配给字典中的值,python,mongodb,pymongo,Python,Mongodb,Pymongo,我有一个Python应用程序,它将字典记录插入MongoDB(通过PyMongo) 字典记录是从CSV文件的行中读取的(它实际上是一个分开的选项卡,但有相同的区别) 要读取CSV文件并将每一行插入MongoDB,我使用以下代码: with open(input_file, 'r') as f_h: reader = csv.DictReader(f_h, delimiter='\t') records = [] for record in reader:

我有一个
Python
应用程序,它将字典记录插入
MongoDB
(通过
PyMongo

字典记录是从
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 = []
这非常有效,除了我的所有值都是
字符串
类型,而事实上,我在记录中也有
int
float
值。我认为Python能够确定类型,但我不确定如何在上面的代码中实现这一点。有人知道这件事吗

更新:

sihrc
Joran
的回答都为我指明了正确的方向。然而,我想用完整的工作实现进行更新。我的问题包括在将字典发送到MongoDB之前,如何更改字典中每个元素的类型。要做到这一点,我必须将它们的代码放在字典中每个
键/值
对的循环中

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

    return dictionary

现在很有魅力。但愿我能接受两个答案

sihrc几乎有了解决方案

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
def convertType(value):
   if value.strip().isdigit():
       return int(value)
   try:
       return float(value)
   except: 
       pass    
   return value
你需要按这个顺序做

因为
float(“1”)
将进行精细转换并返回一个float(在另一个解决方案中),即使它实际上是一个int

你可以把它写得更短(也许更可读)


您正在尝试从输入文件中读取类型吗?你可以试着在试镜范围内试镜。我想我可能需要,但这就是我在这里要问的。+1。。。虽然您可以只
尝试:return cast(value)
而不是赋值给一个变量来返回它。。你的逻辑也有点错误
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