Python ValueError:无法将字符串转换为浮点:(与缓冲区相关?)

Python ValueError:无法将字符串转换为浮点:(与缓冲区相关?),python,xml,atof,Python,Xml,Atof,压缩码 # attempt to condense code while preserving the parts # relevant to the question from xml.sax import handler, make_parser class pdosHandler(handler.ContentHandler): def __init__(self, data): self.data = data self.parts =

压缩码

# attempt to condense code while preserving the parts
# relevant to the question

from xml.sax import handler, make_parser

class pdosHandler(handler.ContentHandler):
    def __init__(self, data):
        self.data   = data
        self.parts  = { 'energy_values': 0 }
        self.energy_values = []

    def startDocument( self ):
        print "Reading started"

    def startElement(self, name, attrs):
        for key, val in self.parts.iteritems():
            if( name == key ):
                self.parts[key] = 1;

    def characters( self, ch ):
        if self.parts['energy_values'] :
            if ch != '\n':
                self.data.energy_values.append(float(ch.strip()))

def pdosreader(inp, data):
    handler = pdosHandler(data)
    parser = make_parser()
    parser.setContentHandler(handler)
    inFile = open(inp)
    parser.parse(inFile)

    inFile.close()
第153-155行:

if( self.parts['energy_values'] ):
    if( ch != '\n' ):
        self.data.energy_values.append( string.atof(normalize_whitespace( ch ) ) )
错误:

Traceback (most recent call last):
  File "siesta_pdos.py", line 286, in <module>
    main()
  File "siesta_pdos.py", line 278, in main
    pdosreader( args[0], data )
  File "siesta_pdos.py", line 262, in pdosreader
    parser.parse( inFile )
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 107, in parse
    xmlreader.IncrementalParser.parse(self, source)
  File "/usr/lib/python2.7/xml/sax/xmlreader.py", line 123, in parse
    self.feed(buffer)
  File "/usr/lib/python2.7/xml/sax/expatreader.py", line 207, in feed
    self._parser.Parse(data, isFinal)
  File "siesta_pdos.py", line 155, in characters
    self.data.energy_values.append( string.atof(normalize_whitespace( ch ) ) )
  File "/usr/lib/python2.7/string.py", line 388, in atof
    return _float(s)
ValueError: could not convert string to float:
回溯(最近一次呼叫最后一次):
文件“siesta_pdos.py”,第286行,在
main()
文件“siesta_pdos.py”,第278行,主目录
pdosreader(参数[0],数据)
pdosreader中第262行的文件“siesta_pdos.py”
parser.parse(infle)
文件“/usr/lib/python2.7/xml/sax/expatreader.py”,第107行,解析中
IncrementalParser.parse(self,source)
文件“/usr/lib/python2.7/xml/sax/xmlreader.py”,第123行,解析中
自进给(缓冲区)
文件“/usr/lib/python2.7/xml/sax/expatreader.py”,第207行,在提要中
self.\u parser.Parse(数据,isFinal)
文件“siesta_pdos.py”,第155行,字符
self.data.energy\u values.append(string.atof(normalize\u whitespace(ch)))
文件“/usr/lib/python2.7/string.py”,第388行,在atof中
返回浮点数
ValueError:无法将字符串转换为浮点:
输入文件:

<pdos>
<nspin>2</nspin>
<norbitals>7748</norbitals>
<energy_values>
           -29.99997
           -29.98997
           -29.97996
           ...
           ... (3494 lines skipped)
           ...
             4.97999
             4.98999
             4.99999
</energy_values>
</pdos>

2.
7748
-29.99997
-29.98997
-29.97996
...
... (跳过3494行)
...
4.97999
4.98999
4.99999
完全输入在:

完整代码位于:


代码正确读取前3116个值,然后返回错误。 请注意,输入较短(例如3000行)的相同代码可以正常工作。 因此,在我看来,这似乎是一个与缓冲区相关的错误,与atof无关

有什么想法吗?

自版本2.0以来已弃用:使用float()内置函数

您声称
float()
无效,这可能意味着您的输入无效。当您发现某些东西无法按预期工作时,使用
打印
非常容易

if( ch != '\n' ):
    print repr(ch), repr(ch.strip())
    print repr(normalize_whitespace(ch))
    print repr(float(ch.strip()))
    self.data.energy_values.append(string.atof(normalize_whitespace(ch)))
因为你必须解释规范化空白,这意味着它是一个糟糕的同义词;如果你把它叫做strip,每个读者都会知道它做了什么,而不必去查它

如果您不知道,
repr
旨在减少歧义。例如:

>>> x = '1.234'
>>> print x
1.234
>>> print repr(x)
'1.234'
>>> print repr(float(x))
1.234

第一次打印时,不清楚x是数字还是字符串。对于repr,不需要猜测。

为什么不使用“float()”而不是string.atof,还请在问题中复制引发异常的值以及相关的源代码,仅从网络链接是不可接受的。3117的值是什么?如果ch.strip():
取而代之?谢谢你的评论。异常总是在第3116行,独立于其中包含的值(如果删除顶部的一些行,代码总是在第3116行停止)。输入文件中有3500行,所有行都有一个浮点数,如上图所示。float()不能求解,normalize_whitespace()是对string.strip()的调用。您好,输入是有效的。为了理解错误,我已经尝试打印出值。有了这些,我可以理解错误与行数有关,而与内容无关。我已经把所有的输入都包含在主帖子中,这样你就可以验证自己了。那么你是说
float(u')
会引发一个ValueError?是的,是的。我同意,现在的问题是理解为什么字符串是空的,而输入不是空的。请看修改后的帖子。非常感谢您的提示。已解决!问题确实与/usr/lib/python2.7/xml/sax/expatreader.py和/usr/lib/python2.7/xml/sax/xmlreader.py中定义的bufsize参数有关,通过将代码从2**16增加到2**17,代码运行良好。是否有任何方法可以在调用过程中更改bufsize,而无需手动更改文件?(我显然不是python专家)