2012-04-16 35 views
5

Tôi có một số mã Python mà kéo dây ra của một tập tin văn bản: MãPython lỗi: không thể chuyển đổi chuỗi nổi

[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854, ....] 

Python:

v = string[string.index('['):].split(',') 
for elem in v: 
    new_list.append(float(elem)) 

này đưa ra một lỗi:

ValueError: could not convert string to float: [2.974717463860223e-06 

Tại sao không thể [2.974717463860223e-06 được chuyển thành phao?

+7

Bạn có thấy '[ 'trong thông báo lỗi của bạn? –

Trả lời

16

Bạn vẫn có số [ ở phía trước "phao" của mình để ngăn phân tích cú pháp.

Tại sao không sử dụng mô-đun thích hợp cho điều đó? Ví dụ:

>>> a = "[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]" 
>>> import json 
>>> b = json.loads(a) 
>>> b 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 

hoặc

>>> import ast 
>>> b = ast.literal_eval(a) 
>>> b 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 
+4

+1: 'literal_eval' là con đường để đi. –

+0

Tại sao không chỉ b = eval (a)? – Akavall

+6

@Akavall 'eval' không an toàn vì nó sẽ đánh giá mã tùy ý. 'literal_eval' sẽ chỉ đánh giá một số mã cấu trúc dữ liệu nhất định, chẳng hạn như danh sách, dicts, bools và' None'. –

3

Bạn đang chụp khung đầu tiên, thay đổi string.index("[") để string.index("[") + 1

0
v = string[string.index('[') + 1:].split(',') 

index() index trở lại của nhân vật nhất định, do đó '[' được bao gồm trong chuỗi trả về bởi [:].

5

Bạn có thể làm như sau để chuyển đổi chuỗi mà bạn đọc từ tập tin của bạn vào một danh sách các phao

>>> instr="[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]" 
>>> [float(e) for e in instr.strip("[] \n").split(",")] 
[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 

Lý do mã của bạn là thất bại là, bạn không tước bỏ '[' khỏi chuỗi.

+3

Nếu 'json.loads' hoặc' ast.literal_eval' không tồn tại, đây sẽ là cách tốt nhất để hoàn thành nhiệm vụ. –

1

này sẽ cung cấp cho bạn một danh sách các phao nổi mà không cần nhập khẩu thêm, vv

s = '[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854]' 
s = s[1:-1] 
float_list = [float(n) for n in s.split(',')] 


[2.467188005806714e-05, 0.18664554919828535, 0.5026880460053854] 
Các vấn đề liên quan