【问题标题】:Python - Convert negative decimals from string to floatPython - 将负小数从字符串转换为浮点数
【发布时间】:2013-01-03 19:07:04
【问题描述】:

我需要读入大量 .txt 文件,每个文件都包含一个小数(有些是正数,有些是负数),并将它们附加到 2 个数组(基因型和表型)中。随后,我希望在 scipy 中对这些数组执行一些数学运算,但是负号('-')会导致问题。具体来说,我无法将数组转换为浮点数,因为“-”被读取为字符串,导致以下错误:

ValueError: could not convert string to float:

这是我目前编写的代码:

import linecache

gene_array=[]
phen_array=[]

for i in genotype:

   for j in phenotype:

      genotype='/path/g.txt'
      phenotype='/path/p.txt'

      g=linecache.getline(genotype,1)
      p=linecache.getline(phenotype,1)

      p=p.strip()
      g=g.strip()

      gene_array.append(g)
      phen_array.append(p)

  gene_array=map(float,gene_array)
  phen_array=map(float,phen_array)

在这一点上我相当肯定是负号导致了问题,但我不清楚为什么。我使用 Linecache 是这里的问题吗?有没有更好的替代方法?

结果

print gene_array

['-0.0448022516321286', '-0.0236187263814157', '-0.150505384829925', '-0.00338459268479522', '0.0142429109897682', '0.0286253352284279', '-0.0462358095345649', '0.0286232317578776', '-0.00747425206137217', '0.0231790239373428', '-0.00266935581919541', '0.00825077426011094', '0.0272744527203547', '0.0394829854063242', '0.0233109171715023', '0.165841084392078', '0.00259693465334536', '-0.0342590874424289', '0.0124600520095644', '0.0713627590092807', '-0.0189374898081401', '-0.00112750710611284', '-0.0161387333242288', '0.0227226505624106', '0.0382173405035751', '0.0455518646388402', '-0.0453048799717046', '0.0168570746329513']

【问题讨论】:

  • 您必须显示您尝试读取的实际数据。像"-123.45" 这样的字符串可以float 很好,但"- 123.45" 不能。
  • 你能打印gene_arrayphen_array吗?也许您的文本文件是空的,而您正在尝试 float 一个空字符串?
  • 我怀疑这是您的实际代码 - 在当前形式下,当您在循环内定义变量时,它将在 for i in genotype 上引发 UnboundLocalError;你也从来没有在任何地方使用ij...
  • @J R:你能不能也打印一下phen_array
  • 我可以map(float,gene_array) 很好...

标签: python string decimal


【解决方案1】:

从您的错误消息中可以看出,问题似乎与空字符串或空格有关

ValueError: could not convert string to float:

要使其工作,请将地图转换为列表理解

gene_array=[float(e) for e in gene_array if e]
phen_array=[float(e) for e in phen_array if e]

空字符串表示

空字符串可能有很多原因

  • 空行或空行
  • 开头或结尾的空白行

【讨论】:

  • 不用strip,在生成原始列表时已经完成了。
  • @MarkRansom:同意我错过了那部分
  • 谢谢 - 成功了。是的 - 我必须压缩代码以提高可读性。非常感谢!
【解决方案2】:

问题绝对不在负号。 Python 可以毫无问题地转换带有负号的字符串。我建议您针对浮动 RegEx 运行每个条目,看看它们是否都通过了。

【讨论】:

    【解决方案3】:

    错误消息中没有任何内容表明- 是问题所在。最可能的原因是 gene_array 和/或 phen_array 包含一个空字符串 ('')。

    如文档中所述,linecache.getline()

    将在出错时返回''(找到的行将包含终止换行符)。

    【讨论】:

    • 您能解释一下“g 和/或 p 末尾的空字符串”是什么意思吗?每个字符串的末尾都有一个空字符串 - 在开头和 ... OP 只读取第 1 行(一遍又一遍),这是可疑的 ...
    • p=p.strip() (等)应该处理空白,不是吗?
    • @mgilson:我的措辞不好。我的意思是gene_arrayphen_array,我说的是gp
    • @NPE -- 啊,我现在在关注。是的,一个空字符串会有问题——但我不知道 OP 使用 linecache 的方式会如何进入那里(除非文件中不存在该行)。无论如何,看来 OP 对我们并不完全诚实...... :)
    猜你喜欢
    • 2018-07-09
    • 1970-01-01
    • 2011-11-25
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多