Только импорт строк с определенным количеством столбцов из файла в Python

Я пытаюсь импортировать несколько файлов в свой код в цикле for для анализа, но не все файлы отформатированы одинаково (и их слишком много для ручного редактирования).

Мне нужны одинаковые данные в каждом файле - 13 столбцов, которые я импортирую как строки. Ниже приведен пример файла:

could not open XWindow display
could not open XWindow display

No graphics display available for this session.
Graphics tasks that attempt to plot to an interactive screen will fail.

/data/poohbah/2/asassn/be/F0041-70_2645
###  JD        HJD            UT_date             IMAGE    FWHM  Diff Limit      mag    mag_err       counts   counts_err   flux(mJy)     flux_err
2456784.50841  2456784.50816  2014-05-07.0072681  interp_bf002339_coadd 2.61 -2.65 17.031      15.543  0.093          526.82        44.57   2.328        0.197       
2456789.45407  2456789.45347  2014-05-11.9529421  interp_be003585_coadd 2.26 -2.31 16.869      15.383  0.093          834.50        70.78   2.695        0.229       
2456790.47441  2456790.47419  2014-05-12.9732922  interp_bf004070_coadd 1.72 -2.25 17.246      15.721  0.090          645.67        52.82   1.974        0.162       
...
(data continues)
...
2457895.45745  2457895.45919  2017-05-21.9587133  interp_bf305499_coadd 1.71 -2.45 17.299      15.482  0.068          673.31        42.10   2.461        0.154       
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:654: RuntimeWarning: invalid value encountered in sqrt
  counts_err_a = np.sqrt( counts_a / options.gain + (area_a * bg_stdev_a **2.0 ) )
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:369: RuntimeWarning: invalid value encountered in less_equal
  no_detected = np.nonzero( (counts <= limit) & (area >= 0.01) )[0]
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:367: RuntimeWarning: divide by zero encountered in log10
  maglimit[notbad] = -2.5 * np.log10(limit[notbad]) + def_zeropt

Мне нужны только данные между строкой '###' и путем '/data' в конце, и во всех файлах этот раздел отформатирован точно так же, с 13 столбцами. Однако "комментарии" в начале и конце любого конкретного файла могут отличаться. У некоторых нет "не удалось открыть отображение XWindow", у других нет путей в конце. Я пытался игнорировать строки, которые начинаются с "#" или "/", но это ничего не делает для самых первых строк или "counts_err_a" и таких строк в конце этого конкретного примера.

Есть ли способ импортировать данные в Python и брать только те строки, которые содержат определенное количество столбцов в них? В псевдокоде это может выглядеть так:

open(file_name)
 if column_number = 13
   np.genfromtxt(file_name)
 else skip

1 ответ

Решение

Вы не будете знать, сколько там столбцов, пока не посчитаете их, поэтому вы можете фильтровать файл по мере его чтения, но вам все равно придется split() линия. Нечто подобное ниже, и вы можете добавить другие проверки, например, если есть много комментариев.

saved_lines = []
with open(filename) as f:
    for line in f:
        if len(line.split()) == 13:
            saved_lines.append(line)

Или эквивалент как comprehension:

with open(filename) as f:
    saved lines = [line for line in f if len(line.split()) == 13]
Другие вопросы по тегам