使用type()信息将存储为字符串的值进行转换
在我的应用程序中,我生成了一些值(有三列,分别是整数、字符串和日期时间,下面有例子),这些值以逗号分隔的字符串形式存储在一个平面文件中。此外,我还存储了一个文件,里面包含了这些值的类型(见下文)。现在,我该如何利用这些信息,把平面文件中的值转换成Python中正确的数据类型呢?这是可能的吗,还是我需要做其他的事情?
数据文件:
#id,value,date
1,a,2011-09-13 15:00:00
2,b,2011-09-13 15:10:00
3,c,2011-09-13 15:20:00
4,d,2011-09-13 15:30:00
类型文件:
id,<type 'int'>
value,<type 'str'>
date,<type 'datetime.datetime'>
7 个回答
1
我最近在一个程序中遇到过类似的情况,需要转换很多字段。我使用了一个包含元组的列表,每个元组里有一个元素是要使用的转换函数。有时候这个函数是 int
或 float
,有时候是一个简单的 lambda
函数,还有时候是其他地方定义的函数的名字。
2
你的类型文件可以更简单:
id=int
value=str
date=datetime.datetime
然后在你的主程序中,你可以这样做:
import datetime
def convert_datetime(text):
return datetime.datetime.strptime(text, "%Y-%m-%d %H:%M:%S")
data_types = {'int':int, 'str':str, 'datetime.datetime':convert_datetime}
fields = {}
for line in open('example_types.txt').readlines():
key, val = line.strip().split('=')
fields[key] = val
data_file = open('actual_data.txt')
field_info = data_file.readline().strip('#\n ').split(',')
values = [] #store it all here for now
for line in data_file.readlines():
row = []
for i, element in enumerate(line.strip().split(',')):
element_type = fields[field_info[i]] # will get 'int', 'str', or 'datetime'
convert = data_types[element_type]
row.append(convert(element))
values.append(row)
# to show it working...
for row in values:
print row
4
根据我的理解,你已经解析了文件,现在只需要获取正确的数据类型。假设 id_
、type_
和 value
是三个字符串,里面包含了文件中的值。(注意,type_
应该是 'int'
这样的形式,比如说,而不是 '<type 'int'>'
这种形式。)
def convert(value, type_):
import importlib
try:
# Check if it's a builtin type
module = importlib.import_module('__builtin__')
cls = getattr(module, type_)
except AttributeError:
# if not, separate module and class
module, type_ = type_.rsplit(".", 1)
module = importlib.import_module(module)
cls = getattr(module, type_)
return cls(value)
然后你可以像这样使用它:
value = convert("5", "int")
不过不幸的是,对于日期时间类型来说,这种方法是行不通的,因为它不能仅仅通过字符串的形式来初始化。