我有一个看起来像一个文件:
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的所有元素是数字,这仅适用。 我怎样才能使它存储字母串和数字作为花车?
我有一个看起来像一个文件:
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的所有元素是数字,这仅适用。 我怎样才能使它存储字母串和数字作为花车?
for line in infile:
data = [x if x.isalpha() else float(x) for x in line.split()]
会有问题,如果你的数据含有非英文字母,也没有有效的浮点数字(例如,“A1”)领域。 您的数据似乎并没有从你说的这些,但如果这样做,在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
,最后它只是放弃,并返回原来的价值,我们知道这将是一个字符串。 (如果我们不知道这是一个字符串,我们可以只坚持str
在与我们通话结束时tryconvert()
$ 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]
您可以使用方法str.isalpha(),str.isalphanum(),以决定str.isdigit如果你的字符串是一个数字或没有。