2015-08-21 2 views
0

Мне нужно импортировать значение массива txt-файла, но когда я печатаю, чтобы увидеть мои значения, я получаю эту ошибку: «не удалось преобразовать строку в float: vector (0.1013, 0.2395, 1.1926) , вектор (0.1276, 0.2361, 1.1760), вектор (0.13952644965926353, 1.23617897201269641, 1.1760001652770353), вектор (0.16723382973344353, 0.23617897201269641, 1.176000165277035) , показывающий только несколько значений массива. Любая идея о том, что я делаю неправильно и что быть правильный способ сделать это?как преобразовать txt-файл в массив python. «не удалось преобразовать строку в float»

def load_files(self): 

    dlg = wx.FileDialog(None,message="Choose File",wildcard= 'Points (*.txt; *.csv)|*.txt;*.csv', defaultFile="",style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST|wx.FD_CHANGE_DIR) 

    if dlg.ShowModal() == wx.ID_CANCEL: 
      print ('buh cancelaste') 

    else: 


     filename=dlg.GetFilename() 
     f = open(filename) 
     data = f.read() 
     data = np.array(data).astype(float) 
     print(data) 


files = wx.Button(pan, label='Load Coordinates', pos=(x1+158,570), size = (150,40)) 
files.Bind(wx.EVT_BUTTON, load_files) 

TXT файл.

вектор (0,1013, 0,2395, 1,1926), вектор (0 0,1276, 0,2361, 1,1760), вектор (0,13952644965926353, 0,23617897201269641, 1,1760001652770353), вектор (0,16723382973344353, +0,23617897201269641, 1,1760001652770353), вектор (+0,18306661834726065, 0,23617897201269641, 1,1760001652770353), вектор (+0,21077399842144068, +0,23219954535704859, 1,1760001652770353), вектор (0,22264858988180353, 0,22822011870140083, 1,1760001652770353), вектор (0,23452318134216635, +0,22822011870140083, 1,1760001652770353)

вектор (-3,22925576, 0,78085742, 8,2709313), вектор (0,12270437, 0,29943441, 1,65709467), вектор (0,1278586, 0,09019178, 1,24548948), вектор (0,25600214, -0,04258577, 0,2099198)

Вектор (0.12795994, 0.30532043, 1.6896684), вектор (0.13624277, 0.09229906, 1.24548948), вектор (0.29656594, -0.08827312, 0.69378916), вектор (0,19870717, -0,09120946, 1,19266453)

+0

Попробуйте использовать numpy.loadtxt (http://docs.scipy.org/doc/numpy/reference/generated/numpy.loadtxt.html) - придется преобразовать imput-файл, в котором он содержит только числа и запятые (если delimiter = ','). –

ответ

0

Сообщение об ошибке указывает на то, что data, как передается np.array представляет собой один или более строк вида

vector(0.1013, 0.2395, 1.1926), vector(0.1276, 0.2361, 1.1760), vector(0.13952644965926353, 0.23617897201269641, 1.1760001652770353), vector(0.16723382973344353, 0.23617897201269641, 1.176000165277035 

одну длинную цепочку. Вы ничего не сделали, чтобы разбить его на пробелы, запятые или даже символы новой строки.

С помощью astype(float) вы пытаетесь преобразовать эту строку в поплавок или последовательность поплавков. Функция Python float(astr) работает со строками типа "0.1013", а не с длинными номерами. Даже если вы сломали data в подстроки как

vector(0.1013, 0.2395, 1.1926) 

было бы проблемы, потому что vector ничего не значит.

Вам нужно сделать больше синтаксического анализа этих файловых строк. Вам нужно разбить их на строки (например, readline()), отделите \n, разделите их на блоки как vector() и разделите их на строки по одному числу. Другими словами, список строк, как это будет работать:

In [848]: np.array(['0.1013', '0.2395', '1.1926']) 
Out[848]: 
array(['0.1013', '0.2395', '1.1926'], 
     dtype='<U6') 

In [849]: np.array(['0.1013', '0.2395', '1.1926']).astype(float) 
Out[849]: array([ 0.1013, 0.2395, 1.1926]) 

Обратите внимание, что происходит, когда data является то, что «вектор()» строка:

In [852]: np.array('vector(0.1013, 0.2395, 1.1926)') 
Out[852]: 
array('vector(0.1013, 0.2395, 1.1926)', 
     dtype='<U30') 

In [853]: np.array('vector(0.1013, 0.2395, 1.1926)').astype(float) 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-853-413e30b24430> in <module>() 
----> 1 np.array('vector(0.1013, 0.2395, 1.1926)').astype(float) 

ValueError: could not convert string to float: 'vector(0.1013, 0.2395, 1.1926)' 

astype(float) не ищет строку (ы) для подстрок, которые выглядят как числа. Попробуйте float('123 45') и варианты. float() требует что-то похожее на поплавок или целое число.