【问题标题】:Python: How can I read in the characters from a line in a file and convert them to floats and strs, depending on if they are numbers or letters?Python:如何从文件中的一行读取字符并将它们转换为浮点数和字符串,具体取决于它们是数字还是字母?
【发布时间】:2012-06-19 21:09:15
【问题描述】:

我有一个看起来像这样的文件:

1 1 C C 1.9873 2.347 3.88776

1 2 C Si 4.887 9.009 1.21

我想逐行读取文件的内容。当我使用的行只有数字时:

for line in readlines(file):
    data = map(float, line.split)

但这只有在 line.split 的所有元素都是数字时才有效。如何让它将字母存储为字符串,将数字存储为浮点数?

【问题讨论】:

  • 为什么不尝试使用“try/exept”?

标签: python input


【解决方案1】:
$ cat 1.py
def float_or_str(x):
  try:
     return float(x)
  except ValueError:
     return x

line = '1 1 C C 1.9873 2.347 3.88776'
print map(float_or_str, line.split())

$python 1.py
[1.0, 1.0, 'C', 'C', 1.9873, 2.347, 3.88776]

【讨论】:

  • 不要使用裸的 except。这是非常糟糕的风格。
  • Ehhhhhh,在这种情况下我会让它过去的。这是一种糟糕的风格,因为它很难弄清楚哪里出了问题,但在这种情况下,只有一个地方可能会出错,而且无论出了什么问题,你都只想做一件事。
  • @asmeurer:我不认为这种情况下的风格不好
  • 引用 PEP 8:“一个好的经验法则是将裸 'except' 子句的使用限制在两种情况下:如果异常处理程序将打印出或记录回溯;至少用户将意识到发生了错误。如果代码需要做一些清理工作,但随后让异常通过 raise 向上传播。try...finally 可能是处理这种情况的更好方法。”。所以在这种情况下这是不好的风格。
  • @asmeurer:无论如何都已修复。谢谢你的提示!
【解决方案2】:
for line in infile:
    data = [x if x.isalpha() else float(x) for x in line.split()]

如果您的数据包含既不是字母也不是有效浮点数的字段(例如,“A1”),则会出现问题。您的数据似乎没有您所说的这些,但如果有,Igor 建议的try/except 方法可能更适合。

我可能会使用一个更通用的函数,它可以被赋予尝试的类型,但是:

def tryconvert(value, *types):
    for t in types:
        try:
            return t(value)
        except (ValueError, TypeError):
            continue
    return value

for line in infile:
    data = [tryconvert(x, int, float) for x in line.split()]

这会将任何被转换为整数的东西转换为int,如果失败它将尝试float,最后它只是放弃并返回原始值,我们知道这将是一个字符串。 (如果我们不知道这是一个字符串,我们可以在对 tryconvert() 的调用结束时粘贴 str。)

【讨论】:

  • 谢谢,这似乎有效!这个网站非常有用
  • @Igor:只有当它实际出现在数据中时才会出现问题。 :-)
  • 更糟糕的是,“C12”.isalpha() 是假的。 Igor 的解决方案更加健壮。它的字面意思是“如果您可以将字段解析为浮点数,请执行此操作,否则将其视为字符串”。
  • @kindall:防弹逻辑:)
【解决方案3】:

您可以使用 str.isalpha()、str.isalphanum()、str.isdigit 方法来确定您的字符串是否为数字。

【讨论】:

  • 并非总是如此。例如:".".isalpha() == False
猜你喜欢
  • 2021-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 2015-01-29
  • 1970-01-01
相关资源
最近更新 更多