2014-01-19 33 views
3

我有一个如下所示的文本文件。我想读取给定的值作为浮动列表。之后我要做一些计算。我用分裂功能和转换浮动。但是我不能把第一个和最后一个转换成方括号。 ([])。它给出了一个错误如下。需要将字符串读取到浮点数组中

文件格式

[-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 

任何一个可以给我一个想法如何,我读了值转换为float数组像下面。

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]

回答

7

使用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] 
+0

感谢名单@ Martijin我感谢你的帮助。 – Shanaka

2

你可以EVAL他们:

for line in F: 
    my_arr = eval(line) 
2

使用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?