【问题标题】:Python Split Specific case handlingPython拆分特定案例处理
【发布时间】:2013-10-10 12:13:27
【问题描述】:

即使使用拆分功能,几个数字也不会拆分

707 K   -7 -7 -6 -8 -2 -5 -8 -8  2 -5 -4 -7 -6  6 -8 -6 -7 -4  8 -6
708 L    0  0 -2 -3 -3  1  3 -3  0 -1 -3  4 -2 -5 -2  0  0 -3 -2  0
709 V   -7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -5 -7 -9 -4 -7
710 P   -1 -2  2  1 -2  1  2 -1  1 -4 -4  2 -3 -4  3  1  0 -1 -3 -4
711 E   -3 -3 -3  1 -6  1  5 -3  2  0 -1 -1 -1 -1 -5 -2 -1 -4  0  0
712 C   -7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -4 -7 -9 -9 -7
713 S   -4 -4  1  1 -5 -2 -1  6 -1 -8 -7 -3 -7 -4 -2 -1 -3 -4 -4 -7

这个矩阵来自一个文本文件并且非常大(文件中的行数以及此类文件的数量)。

我成功读取了python中的行并将它们拆分为

m = fp.readline(); [fp is the file pointer and reading is done in loop]

m = m.split() ; [splitting by elements ]

m = map(int,m[2:22]); [ mapping to make strings as integers from index 2 to 22 ]

但这会导致第 709 行和第 712 行出现错误(见矩阵的最左侧)

Traceback (most recent call last):
  File "<pyshell#150>", line 1, in <module>
    map(int,m[2:22].split())
ValueError: invalid literal for int() with base 10: '-7-10'

那是因为文件格式错误,'-7-10' 没有按预期拆分'-7' '-10'。

所以问题是如何处理这种格式错误,以便像矩阵中的其他行一样拆分和处理整数?请记住,对于非常大的行和文件,必须这样做,因此手动编辑格式错误是不可行的,尽管单个文件中的此类错误在 100 个以内。请帮助我...谢谢

【问题讨论】:

  • 按索引位置而不是空格分割字符串。

标签: python string map split


【解决方案1】:

您可以对所有负号执行replace,以确保它们前面至少有一个空格:

m = "-7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -5 -7 -9 -4 -7"
print m.replace("-", " -").split()

结果:

['-7', '-10', '-9', '-10', '12', '-9', '-10', '-9', '-9', '-8', '-8', '-9', '-8', '-9', '-9', '-5', '-7', '-9', '-4', '-7']

当然,只有当它是一个负数与它的邻居对接时,这才有用。如果您有冲突值,例如:

707 K   -1 -2 -3
707 K   -4123 -6

那么你就不能轻易将 -4 和 123 区分开来。

【讨论】:

  • 不,我没有混合的正数...问题只是负数,我解决了...谢谢
【解决方案2】:

您可以(正如 Simeon 在 cmets 中指出的那样)只需按固定位置解析数字;这种理解是通过从 7 循环到 67、步进 3 并将子字符串转换为整数来实现的; (您的示例中的字段似乎从位置 7 开始,每个长度为 3 个字符)

>>> m
'709 V   -7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -5 -7 -9 -4 -7\n'

>>> a = [int(m[pos:pos+3]) for pos in range(7,67,3)]

>>> a
[-7, -10, -9, -10, 12, -9, -10, -9, -9, -8, -8, -9, -8, -9, -9, -5, -7, -9, -4, -7]

【讨论】:

  • 是的,这也有效......但它更类似于 simeon 的答案......谢谢
【解决方案3】:

您可以使用re 模块查找与特定正则表达式模式匹配的所有子字符串:

>>> x = "-7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -4 -7 -9 -9 -7"
>>> import re
>>> re.findall( r"-?[0-9]+", x )
['-7', '-10', '-9', '-10', '12', '-9', '-10', '-9', '-9', '-8', '-8', '-9', '-8', '-9', '-9', '-4', '-7', '-9', '-9', '-7']

当然,如果您可能将7, 123 格式化为7123,那么您唯一的选择就是通过索引而不是内容模式来分割字符串。

【讨论】:

    【解决方案4】:

    由于您处理的数据是固定格式的数据,最好使用struct模块解析数据,而不是使用split

    >>> from struct import *
    >>> line="712 C   -7-10 -9-10 12 -9-10 -9 -9 -8 -8 -9 -8 -9 -9 -4 -7 -9 -9 -7"
    >>> format_string = "<3s2s2s"+"3s"*20
    >>> unpack(format_string,line)
    ('712', ' C', '  ', ' -7', '-10', ' -9', '-10', ' 12', ' -9', '-10', ' -9', ' -9', ' -8', ' -8', ' -9', ' -8', ' -9', ' -9', ' -4', ' -7', ' -9', ' -9', ' -7')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      相关资源
      最近更新 更多