Как прочитать из файла массив

#python

#python

Вопрос:

У меня есть некоторый массив, который я записал в текстовый файл, массив, подобный этому:

 [ 121.6  114.7  117.9  122.1  114.8  121.2  115.3  116.3  116.   121.
  115.3  120.8  114.4  115.5  116.9  127.7  119.4  118.1  116.3  115.3
  119.5  115.7  116.1  114.3  119.   116.   114.2  340.8  114.6  116.6
  118.5  114.1  121.3  120.6  116.3]
  

и еще один массив, подобный этому

 [[122.54227 ]
 [123.13425 ]
 [122.04907 ]
 [122.696365]
 [123.1821  ]
 [121.818115]
 [123.11479 ]
 [121.908745]
 [122.193954]
 [121.94495 ]
 [122.76871 ]
 [121.7559  ]
 [122.98235 ]
 [121.78393 ]
 [122.06499 ]
 [122.05317 ]
 [123.91927 ]
 [122.679565]
 [123.07596 ]]
  

возможно ли с помощью read file вернуться к этой форме массива?

Комментарии:

1. Между элементами массива в текстовом файле нет запятых?

2. Да, это возможно, что вы пробовали до сих пор?

3. Попробуйте и покажите нам свою попытку!

Ответ №1:

Сначала прочитайте и сохраните содержимое файла следующим образом:

 with open('input.txt', 'r') as myfile:
    filearray = myfile.read()
  

Если содержимое filearray отформатировано как допустимый список python (например. [1, 2, 3, 4] или [[1], [2], [3], [4]] ), вы можете использовать непосредственно literal_eval из ast модуля:

 outputlist = literal_eval(filearray)
print(type(outputlist),outputlist)
  

Вывод:

 <class 'list'> [1, 2, 3, 4]
  

Если значения списка в файле не разделены запятыми, вы можете использовать регулярное выражение для форматирования его в допустимый список (демонстрация: https://regex101.com/r/4aO40h/2 ):

 filearray = re.sub(r"(?<![)[,s] (?!s*])(?=.*w)",", ", filearray)
outputlist = literal_eval(filearray)
print(type(outputlist),outputlist)
  

Вывод:

 <class 'list'> [1, 2, 3, 4]
  

Комментарии:

1. Я попытался использовать форму, не разделенную запятыми, но у меня такая ошибка: файл «<неизвестно>», строка 1 [117.7, , 118.1, , 119.4, , 121.6, , 114.7, , 117.9, , 122.1, , 114.8, , 121.2, , 115.3 ^ SyntaxError: недопустимый синтаксис

2. Пожалуйста, включите содержимое вашего файла в свой пост, чтобы я мог соответствующим образом скорректировать свой ответ.

3. теперь это, кажется, работает, но почему у меня есть что-то вроде ([1 2 3]), является ли «(» и «)» проблемой? или это все еще одномерный массив

4. Он создал кортеж ( , ) со списком в качестве первого элемента, потому re.sub() что добавил запятую в конец списка. Я соответствующим образом отредактировал свой код. Если он все еще выводит кортеж, вы можете просто добавить if(type(outputlist) is tuple): outputlist = outputlist[0] в конце кода, чтобы получить список.