Загрузка файлов с несколькими подгонками через одну строку

У меня есть 200 подходящих файлов, которые мне нужно загрузить и усреднить, чтобы создать карту. Тем не менее, мне было интересно, есть ли способ сделать все это в одной строке, а не 200 строк "fits.open". Я видел это где-то, но я не могу вспомнить, где.

Имена файлов идут как Coadd000_5.fits, Coadd001_5.fits, Coadd002_5.fits, Coadd003_5.fits ... Coadd199_5.fits.

Так что это должно быть что-то похожее на

hdulist2 = fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lensing/actPolS2LensProducts/realKappaCoadd' + xyz + '_5.fit')

или что-то похожее на это. Должен ли я сделать цикл for с переходом от 0 до 199?

Спасибо

3 ответа

Решение

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

mylist = [ deal_with( 'realKappaCoadd%03d_5.fit' % i ) for i in range(200) ]

(путь к файлу сокращен для удобства чтения)

В любое время вы обнаружите, что хотите инициализировать пустой list а потом .append() к этому в for цикл, думать "список понимания", чтобы сделать это в одну строку. Или "генераторное выражение", которое является тесно связанным синтаксисом, но с ленивым вычислением (которое позволит вам обрабатывать вещи "сначала в глубину", в то время как на первый взгляд кажется, что они идут в ширину, но я сомневаюсь, что в этом есть какое-то реальное преимущество) твой случай).

Вы также можете найти полезным перебрать вывод glob который найдет все имена файлов, соответствующие определенному шаблону:

import glob
list_of_filenames = sorted( glob.glob( 'realKappaCoadd*_5.fit' ) )
mylist = [ deal_with( filename ) for filename in list_of_filenames ]

Поскольку (из комментариев) кажется, что открытие fits файл влечет за собой много накладных расходов, вы, вероятно, хотите только один открытый за один раз. Поэтому вы должны эффективно работать "в глубину", полностью завершив свой бизнес одним файлом, прежде чем переходить к следующему. IMO самый читаемый способ сделать это, чтобы поместить все необходимые шаги для одного файла, последовательно, в вашем deal_with функция:

def deal_with(single_filename):
    file_handle = fits.open(single_filename)
    result = do_whatever_processing(file_handle)
    # ...
    # if necessary, explicitly close the file here
    return result

Использовать for цикл:

dirname = '<path_to_files>'
average = 0
for filename in glob.glob(os.path.join(dirname, 'Coadd*_5.fits')):
    with fits.open(filename) as hdul:
        # Update 'average', whatever that means in this specific case

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

Что конкретно вы пытаетесь сделать? Скорее всего, уже есть библиотека, которая поможет.

Вы можете сделать это довольно легко с помощью цикла for:

hdulist2 = [fits.open('/Users/alibinesh/Desktop/Data/actpolS2Lensing/actPolS2LensProducts/realKappaCoadd%03d_5.fit' % i) for i in range(200)]
Другие вопросы по тегам