Загрузка файлов с несколькими подгонками через одну строку
У меня есть 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)]