Python 使用type()信息强制转换存储为字符串的值

Python 使用type()信息强制转换存储为字符串的值,python,casting,data-conversion,built-in-types,Python,Casting,Data Conversion,Built In Types,在我的应用程序中,我生成了许多值(三列,int、str和datetime类型,见下面的示例),这些值作为逗号分隔的字符串存储在平面文件中。此外,我存储了一个包含值类型的文件(见下文)。现在,如何使用这些信息将我的值从平面文件转换为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-

在我的应用程序中,我生成了许多值(三列,int、str和datetime类型,见下面的示例),这些值作为逗号分隔的字符串存储在平面文件中。此外,我存储了一个包含值类型的文件(见下文)。现在,如何使用这些信息将我的值从平面文件转换为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'>
id,
价值
日期,
遵循以下步骤:

  • 逐行读取文件,每行执行以下步骤
  • 使用
    Split()
    作为分隔符拆分行
  • 将列表的第一个元素(从步骤2开始)强制转换为int。将第二个元素保留为string。解析第三个值
    (例如使用切片)
    ,并为其创建一个
    日期时间
    对象

  • 我必须在最近的一个项目中处理类似的情况,该项目必须转换许多字段。我使用了一个元组列表,其中元组的一个元素是要使用的转换函数。有时是
    int
    float
    ;有时是一个简单的
    lambda
    ;有时它是在别处定义的函数名。

    不要有一个单独的“类型”文件,而是把
    (id、value、date)
    的元组列表拿出来

    或者,您必须解决将字符串转换为类型的转换器存储为文本(在“类型”文件中)的问题,这可能是一个有趣的问题,但如果您只是想完成某件事,请先使用或

    ,您无法编写“通用”或“智能”转换来神奇地处理任何事情

    第二,试图用代码以外的任何东西来概括字符串到数据的转换似乎都不会奏效。因此,与其编写命名转换的字符串,不如编写转换

    最后,尝试用特定于域的语言编写配置文件是愚蠢的。只需编写Python代码。这并不比试图解析某个配置文件复杂多少

    是可能的还是我需要做一些其他的事情

    不要浪费时间尝试创建一个不仅仅是Python的“类型文件”。这没用。将转换编写为Python函数更简单。您可以像导入“类型文件”一样导入该函数

    这就是“类型文件”中的所有内容

    现在,您可以像这样读取(并处理)您的输入

     from type_file import convert
     import csv
    
     with open( "date", "rb" ) as source:
         rdr= csv.DictReader( source )
         for row in rdr:
             useful_row= convert( row )
    

    在许多情况下,我在运行前不知道列数或数据类型

    这意味着你注定要失败

    您必须具有文件内容的实际定义,否则无法进行任何处理

    "id","value","other value"
    1,23507,3
    
    您不知道“23507”是整数、字符串、邮政编码还是浮点(省略了句点)、持续时间(以天或秒为单位)或其他更复杂的东西。你不能希望,也不能猜测

    获得定义后,需要根据实际定义编写显式转换函数

    在编写转换之后,您需要(a)使用简单的单元测试测试转换,以及(b)测试数据以确保它真正转换


    然后您可以处理该文件

    据我所知,您已经解析了该文件,现在只需要获得正确的类型。比如说
    id
    type
    value
    是包含文件中的值的三个字符串。(注意,
    类型
    应包含
    'int'
    -例如-,而不是
    '

    然后您可以像..一样使用它:

    value = convert("5", "int")
    

    不幸的是,对于datetime来说,这不起作用,因为它不能简单地用字符串表示法初始化。

    您的类型文件可以更简单:

    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
    

    您可能需要查看xlrd模块。如果您可以将数据加载到excel中,并且它知道与每个列关联的类型,xlrd将在您读取excel文件时为您提供该类型。当然,如果数据以csv形式提供给您,则必须有人进入excel文件并手动更改列类型


    我不确定这会让你一直到你想去的地方,但这可能会有帮助。嗨,读取、拆分等都完成了。我正在尝试使用类型文件中的信息实现泛型类型转换。一般来说,我不知道列是什么类型,这是类型文件在运行时必须告诉我的!Ohk!然后你只需要pare类型文件并将其存储在某个数据结构中,以便获得文件的结构。之后,您可以根据需要解析数据文件(但我认为您需要对
    datetime
    类型做一些事情)。此外,泛型类型转换还意味着内置类型或任何用户定义类型?如果用户定义类型也要得到支持,这将需要大量编程。:)是的,我已经完成了,但最大的问题仍然是,如何在运行时从字符串“2011-09-13 15:00:00”中获取例如datetime.datetime对象(这些类型也可以是Decimal、float等)我不能只使用简单的字符串匹配,例如:tmp_type=='float':返回float(val)一个简单的正则表达式可能也会对您有所帮助……也许您可以在类型文件告诉您需要解析日期时间对象时查看。正则表达式不够好,可能是我的字符串列实际上是一个整数列表,但在Python中必须被视为字符串……因此,类型文件必须确定所有类型!请参阅OP对您的答案的评论。OP已经完成了拆分并需要转换数据。我的答案解决了这一问题。对于简单的事情,您可以使用
    int
    等。对于复杂的事情,例如
    datetime
    ,您需要一个函数。使用这样的字段列表可以以结构化的方式完成此操作。我已经考虑过转换离子函数,但我想有一个更通用的方法
    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