2014-04-08 35 views
0

我有一个csv行,每行的元素可以是不同的类型(int,str,float,...)。例如拆分一个字符串,但保留类型

"today is", 10, "tomorrow is" 20 

我也有这种类型的SQL查询:

ramble varchar, 
date int, 
ramble varchar, 
date int, 

我的目标是要找到如有输入文本与SQL模式的要求。要做到这一点,我想,在蟒蛇:

  1. 拆分输入文本,并
  2. 检查每个元素的类型是否与SQL模式匹配

然而,当我分割字符串使用string.split()(或re.split())返回列表的所有元素都是“string”类型。所以我的问题是,如何保留分割后的输入类型?

谢谢。

+0

你是什么意思“拆分输入文本,”它已经用逗号分隔 – wnnmaw

+0

我想你错过了你的csv行中的最后一个逗号 –

+0

我不认为这是可能的。从阅读文件你不能确定的东西是一个字符串或一个int等 – Jeroen

回答

1
def try_cast(val): 
    try: 
     if float(val) - int(val) > 0.01: 
      return float(val) 
     return int(val) 
    except: 
     return val 

import csv 
from functools import partial 
fname = "test.csv" 
cast_row_map = partial(map,try_cast) 
data = map(cast_row_map,csv.reader(open(fname))) 

可以做你想做的

+0

谢谢乔兰。很好地工作。 – Peyman

1

我认为@JoranBeasley答案会工作。然而,对于初学者来说,“部分”和对“map()”的调用可能有点不透明。

不过,请注意,“try_cast”可以增强以“寻找”任何类型的数据,比如这个:

import datetime 
def try_cast(val): 
    try: 
     format = "%Y-%m-%d %H:%M:%S" 
     return datetime.strptime(val, format) 
    except: 
     # looks like it is not a date 
     pass 
    try: 
     # I prefer this test over Joran's 
     if float(val) == int(val): 
      return int(val) 
     return float(val) 
    except: 
     # looks like it is not an int or float either 
     return val 
相关问题