【问题标题】:Remove unwanted characters and convert to int in Python删除不需要的字符并在 Python 中转换为 int
【发布时间】:2016-01-20 07:37:48
【问题描述】:

当文件以如下格式显示时,从文件中读取一行数字的最佳方法是:

[1, 2, 3 , -4, 5]
[10, 11, -12, 13, 14 ]

令人讨厌的是,正如我所描述的,有时数字之间有多余的空格,有时没有。我尝试使用CSV 来解决逗号问题,但事实证明括号和随机空格也很难删除。理想情况下,我会将括号之间的每个数字作为int 附加到list,但当然括号会导致int() 失败。

我已经研究过 Removing unwanted characters from a string in PythonPython Read File, Look up a String and Remove Characters 建议的类似解决方案,但不幸的是,当我尝试将所有内容结合起来时,我总是失败。

【问题讨论】:

  • 为了解决这个问题,我最终结合了@Muhammad 的方法2 和@Zac 的答案; [int(s) for s in str.split() if s.isdigit()] 清理字符串本身,然后 eval() 将其转换为整数列表以供我的程序的其余部分使用。

标签: python string file-io int removing-whitespace


【解决方案1】:

使用正则表达式从字符串中删除任何不需要的字符

import re
text_ = re.sub("[0-9]+", " ", text);

第二种方法:

str = "h3110 23 cat 444.4 rabbit 11 2 dog"
>>> [int(s) for s in str.split() if s.isdigit()]
[23, 11, 2]

【讨论】:

  • 输入是'一行数字',它不是一行随机字符串。
  • 然后使用正则表达式。您可以在此处了解有关表达式的更多信息 docs.python.org/2/library/re.html> 和 tutorialspoint.com/python/python_reg_expressions.htm>
  • 我知道正则表达式。但是你的回答并没有回答关于将一行整数写成列表的问题。
  • 如果有多余的空格表示该行由字符串组成,即使其中的非数字字符只是空白。正则表达式非常适合这种操作。
  • 所以,方法 2 完成了我需要的一半,并清理了字符串。但是,我按照@Zac 的建议使用eval() 将整个字符串转换为我需要的整数列表。我考虑过使用ast,但我真的不需要担心恶意输入,因为这是学校作业。不管怎样,祝大家好运!
【解决方案2】:

使用ast.literal_eval() 是另一种选择:

from ast import literal_eval

with open("your_file.txt") as file_obj:
    for line in file_obj:
        lst = literal_eval(line)
        do_stuff(lst)

【讨论】:

    【解决方案3】:

    由于每一行似乎都是文字 python 列表,您可以使用 ast 模块:

    import ast
    
    with open('myfile.txt') as fh:
        for line in fh:
            numbers_list = ast.literal_eval(line)
    

    请注意,您可以使用内置函数 eval() 获得相同的结果,但使用 ast 对恶意输入更安全。

    【讨论】:

      【解决方案4】:

      使用json 模块将每一行解析为JSON 数组。

      import json
      
      list_of_ints = []
      for line in open("/tmp/so.txt").readlines():
          a = json.loads(line)
          list_of_ints.extend(a)
      print(list_of_ints)
      

      这会将所有行中的所有整数收集到list_of_ints。输出:

      [1, 2, 3, -4, 5, 10, 11, -12, 13, 14]
      

      【讨论】:

      • 这是一个解决方案,但是在这里使用 JSON 转换似乎是开销
      • 我怀疑对于输入提供的这种开销甚至是可测量的。
      • 我猜输入的只是一个更大文件的样本。测量最终的开销可能会很有趣。
      • 我曾认为这是一个可能的选择,但我认为 JSON 对象更多地用于字典。不过很高兴知道
      猜你喜欢
      • 2022-01-26
      • 1970-01-01
      • 2021-03-13
      • 2022-11-17
      • 2011-06-17
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多