我有一个csv行,其中每行的每个元素可以是不同类型(int
,str
,float
,...)。 e.g。
"today is", 10, "tomorrow is" 20
我还有一个类型的SQL查询:
ramble varchar,
date int,
ramble varchar,
date int,
我的目标是查找是否有任何输入文本符合sql架构。要做到这一点,我想在python:
但是,当我使用string.split()
(或re.split()
)分割字符串时,返回列表的所有元素都是"字符串"的类型。所以我的问题是,如何在拆分后保留输入的类型?
答案 0 :(得分: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)))
可能会做你想要的事情
答案 1 :(得分: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