4

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

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 的所有元素都是数字时才有效。如何让它将字母存储为字符串,将数字存储为浮点数?

4

3 回答 3

9
$ 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]
于 2012-06-19T21:13:13.643 回答
1
for line in infile:
    data = [x if x.isalpha() else float(x) for x in line.split()]

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

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

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()]

这会将任何转换为​​整数的内容转换为 an int,否则它将尝试float,最后它只是放弃并返回原始值,我们知道这将是一个字符串。(如果我们不知道它是一个字符串,我们可以str在调用结束时坚持tryconvert()。)

于 2012-06-19T21:13:54.153 回答
-1

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

于 2012-06-19T21:15:04.143 回答