代码之家  ›  专栏  ›  技术社区  ›  Alex B

如何让“int”解析空字符串?

  •  21
  • Alex B  · 技术社区  · 16 年前

    我有一个基于布局表的固定长度文本记录解析系统:

    parse_table = [\
        ('name', type, length),
        ....
        ('numeric_field', int, 10), # int example
        ('textc_field', str, 100), # string example
        ...
    ]
    

    其思想是,给定一个消息类型的表,我只需遍历字符串,然后根据表中的条目从中重建一个字典。

    现在,我可以处理字符串和整数,但是 int() 不会解析所有空格字段(当然,这是一个很好的理由)。

    int 处理空白字符串的。这样我就可以改变相应表条目的类型,而不必在解析代码中引入额外的乱码(比如过滤器),而且它“只起作用”。

    我该如何处理这个问题?我也愿意接受不会增加太多复杂性的替代方案。

    4 回复  |  直到 16 年前
        1
  •  43
  •   Arlaharen    16 年前

    使用工厂函数而不是int或int的子类:

    def mk_int(s):
        s = s.strip()
        return int(s) if s else 0
    
        2
  •  35
  •   evaldaz    8 年前

    使用 int() 带参数的函数 s.strip() or 0 ,即:

    int(s.strip() or 0)
    

    或者如果您知道字符串始终只包含数字字符或为空( "" ),然后:

    int(s or 0)
    
        3
  •  6
  •   badp    16 年前
    lenient_int = lambda string: int(string) if string.strip() else None
                                                              #else 0
                                                              #else ???
    
        4
  •  0
  •   Elias EstatisticsEU    10 年前

    元组,元组内部有 一) 空/空值, ii)数字、数字以及字符串 iii)空/空列表。例如:

    mylist=[('','1',[]),('',[],2)]
    

    @我在这里重复,你的解决方案,有些不同,为了添加关键字,因为,我浪费了很多时间,为了找到它!

    下面的解决方案是将空字符串、空字符串或其他空列表剥离/转换为零,但将包含数字/数字的非空字符串、非空列表保留为字符串,然后将这些字符串转换为数字/数字。

    简单的解决方案。请注意,“0”可以替换为iterable变量。 注意,第一种解决方案不能处理元组中的空列表。

    int(mylist[0][0]) if mylist[0][0].strip() else 0
    

    int(mylist[0][0] or '0')
    

    将字符串转换为数字/将字符串转换为数字/将字符串转换为整数 删除空列表/删除空字符串/将空字符串视为数字/数字 将空字符串转换为数字/数字/将空字符串转换为整数