【问题标题】:Need to read string into a float array需要将字符串读入浮点数组
【发布时间】:2014-02-08 22:56:28
【问题描述】:

我有一个如下所示的文本文件。我想将给定值作为浮动列表读取。之后我会做一些计算。我使用了拆分功能并转换为浮动。但我不能转换第一个和最后一个,因为这两个有方括号。 ([ ])。它给出了如下错误。

文件格式

[-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927,... 1000 records]
[2.758, -0.951, -1.7952, 0.4255, 2.5403, 1.0233,... 1000 records]
[0.682, -2.205, 2.1981, 2.1329, 0.1574, -0.4695,... 1000 records]

错误

 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 ValueError: could not convert string to float: [0.682

我使用的代码

F = open('XYZ.txt', 'r')
>>> for line in F:
...     P = line.split(',')
...     P

谁能告诉我如何将这些值读入如下所示的浮点数组中。

X = [-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927,... 1000 records]
Y = [2.758, -0.951, -1.7952, 0.4255, 2.5403, 1.0233,... 1000 records]
Z = [0.682, -2.205, 2.1981, 2.1329, 0.1574, -0.4695,... 1000 records]

然后我可以调用 X[1]、X[999] 之类的值

【问题讨论】:

    标签: python


    【解决方案1】:

    使用json.loads()

    import json
    line = "[-1.504, 1.521, 1.531, 1.1579, -2.2976]"
    row = json.loads(line)
    

    编辑:我发现@Martijn 的答案很有趣,因为我几乎从不使用 ast,所以我运行了一个小型基准测试:

    import timeit
    import random
    
    line = [random.random() for x in range(1000)]
    n = 10000
    
    json_setup = 'line = "{}"; import json'.format(line)
    json_work = 'json.loads(line)'
    json_time = timeit.timeit(json_work, json_setup, number=n)
    print "json: ", json_time
    
    ast_setup = 'line = "{}"; import ast'.format(line)
    ast_work = 'ast.literal_eval(line)'
    ast_time = timeit.timeit(ast_work, ast_setup, number=n)
    print "ast: ", ast_time
    
    print "time ratio ast/json: ", ast_time / json_time
    

    我多次运行此代码并始终得到这种结果:

    $ python json-ast-bench.py 
    json: 4.3199338913
    ast: 28.4827561378
    time ratio ast/json:  6.59333148483
    

    因此,对于这个用例,ast 似乎慢了一个数量级。

    编辑: Why is json.loads an order of magnitude faster than ast.literal_eval?

    【讨论】:

      【解决方案2】:

      你可以评估它们:

      for line in F:
        my_arr = eval(line)
      

      【讨论】:

        【解决方案3】:

        使用ast.literal_eval() 将每一行解析为浮点数列表:

        import ast
        
        with open('XYZ.txt', 'r') as infh:
            for line in infh:
                row = ast.literal_eval(line)
                print row
        

        ast.literal_eval() 将每一行解释为包含文字 Python 值、支持列表、元组、字典、字符串和数字文字。

        演示:

        >>> import ast
        >>> ast.literal_eval('[-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927]\n')
        [-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927]
        

        【讨论】:

        • Thanx @Martijin 感谢您的帮助。
        猜你喜欢
        • 2011-11-13
        • 2021-12-09
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多