使用type()信息将存储为字符串的值进行转换

4 投票
7 回答
9031 浏览
提问于 2025-04-17 02:12

在我的应用程序中,我生成了一些值(有三列,分别是整数、字符串和日期时间,下面有例子),这些值以逗号分隔的字符串形式存储在一个平面文件中。此外,我还存储了一个文件,里面包含了这些值的类型(见下文)。现在,我该如何利用这些信息,把平面文件中的值转换成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

我最近在一个程序中遇到过类似的情况,需要转换很多字段。我使用了一个包含元组的列表,每个元组里有一个元素是要使用的转换函数。有时候这个函数是 intfloat,有时候是一个简单的 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")

不过不幸的是,对于日期时间类型来说,这种方法是行不通的,因为它不能仅仅通过字符串的形式来初始化。

撰写回答