Что эквивалентно Matlab fscanf в Python?

Функция Matlab fscanf() кажется очень мощной. Есть ли аналог того же в python (или numpy)?

В частности, я хочу прочитать матрицу из файла, но я не хочу перебирать каждую строку, чтобы прочитать матрицу. Что-то в этом роде (из матлаба для чтения 2D-матрицы 1000x1000):

matrix = fscanf(fopen('input.txt'),'%d',[1000,1000]); 

person Atul Goyal    schedule 23.03.2011    source источник


Ответы (5)


В Python нет встроенной функции fscanf. Ближайший способ сделать это — прочитать файл построчно и использовать регулярные выражения.

Однако Numpy (библиотека Python, похожая на Matlab) имеет функцию, которая позволяет читать файл и создавать массив из содержимого: numpy.fromfile (или, как предлагается в других ответах numpy.loadtxt может больше подходит в данном случае).

person Wookai    schedule 23.03.2011
comment
numpy.fromfile очень низкий уровень. Если вы хотите очень и очень быстро прочитать двоичные данные или очень просто отформатированный текстовый файл, то это хороший вариант. Однако, вообще говоря, для этой цели OP, вероятно, было бы лучше использовать numpy.loadtxt или numpy.genfromtxt. fromfile лучше подходит для двоичных данных, хотя он также может обрабатывать простые текстовые форматы. loadtxt и genfromtxt намного гибче, но немного медленнее. (Разница между ними в том, что genfromtxt обрабатывает отсутствующие значения, а loadtxt — нет) - person Joe Kington; 23.03.2011
comment
Спасибо, я обновил свой ответ на случай, если ОП не прочитает ваш проницательный комментарий. - person Wookai; 24.03.2011

Я почти уверен, что нет, но итерация не слишком сложна. Это сделает это:

matrix = []
for i in open('input.txt'):
    matrix.append( map(int, i.split()) )

Если вам нужно что-то более сложное (т. е. не просто целые числа, разделенные одиночными символами), регулярные выражения могут подойти.

person Steve Howard    schedule 23.03.2011

Я думаю, что ответ Вукая неверен. Я думаю, что numpy.loadtxt — это то, что ты ищешь.

person Xavier Combelle    schedule 23.03.2011

Вы взглянули на numpy? - http://www.scipy.org/Download

Кстати, внутри fscanf хранит данные в порядке столбцов, так что я не думаю, что будет какой-то выигрыш в эффективности. http://www.mathworks.com/help/techdoc/ref/fscanf.html

person Sumod    schedule 23.03.2011

Я думаю, что pythonic способ сделать это - открыть файл и прочитать данные в list из lists, используя понимание списка.

(Для ясности я использую данные из строки и читаю их, как если бы они были из файла, используя StringIO.)

>>> from cStringIO import StringIO
>>> data_file="1 2 3 4 5 6\n7 8 9 10 11 12\n13 14 15 16 17 18\n19 20 21 22 23 24\n"
>>> reader=StringIO(data_file)
>>> array=[map(int, reader.readline().split()) for i in xrange(4)]
>>> array
[[1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18], [19, 20, 21, 22, 23, 24]]

Как упоминалось в более раннем ответе, у numpy есть более прямой метод.

person MAK    schedule 23.03.2011