У меня есть программа на C, которая делает файл вывода называется orbits_toy_model.dat следующим образом:

1.00000e-003     1.80000e-003   0.099799950033337   0.200099899983342
2.80000e-003     3.24000e-003   0.099439608731989   0.200279215634646
6.04000e-003     5.83200e-003   0.098790183270494   0.200600348178616

Итак, я сделал простую программу на python для чтения данных и сохранения в массиве:

from numpy import loadtxt
lines = loadtxt("C:/Users/Marta/OneDrive/Documents/Master/TFM/Code/EjemploIntegracion/prueba.dat", comments="#", delimiter=" ", unpack=False)

Это работает для простого файла данных:

1 2 3
4 5 6

Но когда я запускаю фактический файл данных не работает, он говорит:

Traceback (most recent call last):
  File "C:/Users/Marta/.PyCharmCE2018.2/config/scratches/scratch_7.py", line 10, in <module>
    lines = loadtxt("C:/Users/Marta/OneDrive/Documents/Master/TFM/Code/EjemploIntegracion/orbits_toy_model.dat", comments="#", delimiter=" ", unpack=False)
  File "C:\Users\Marta\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\npyio.py", line 1101, in loadtxt
    for x in read_data(_loadtxt_chunksize):
  File "C:\Users\Marta\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\npyio.py", line 1028, in read_data
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "C:\Users\Marta\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\npyio.py", line 1028, in <listcomp>
    items = [conv(val) for (conv, val) in zip(converters, vals)]
  File "C:\Users\Marta\AppData\Local\Programs\Python\Python37\lib\site-packages\numpy\lib\npyio.py", line 746, in floatconv
    return float(x)
ValueError: could not convert string to float: 

Кажется, что формат моего файла не в надлежащем порядке, есть ли способ сделать это с этим форматом в Python ?.

0
Macadamia Brazowy 9 Окт 2019 в 22:54
Набор данных состоит из 4 цифр и после перехода к следующей строке.
 – 
Macadamia Brazowy
9 Окт 2019 в 22:55

1 ответ

Ваш разделитель (delimiter=" ") является причиной сбоя.

Разделителем по умолчанию в numpy.loadtxt является «Любые пробелы». Поскольку вы указываете один пробел, он использует его как разделитель, но затем включает все остальные пробелы как часть значения.

Если вы не укажете параметр delimiter, вы получите ожидаемые значения (где test.dat - ваши данные в том виде, в каком они были опубликованы):

>>> import numpy
>>> numpy.loadtxt('test.dat', comments='#', unpack=False)
array([[0.001     , 0.0018    , 0.09979995, 0.2000999 ],
       [0.0028    , 0.00324   , 0.09943961, 0.20027922],
       [0.00604   , 0.005832  , 0.09879018, 0.20060035]])
0
b_c 9 Окт 2019 в 23:05