Создание массивов при обработке большого файла

#python

#python

Вопрос:

Это мой первый пост, хотя я читал SO некоторое время. Я новичок в Python, и мне понадобится ваша помощь. Я обрабатываю очень большой файл (более 2 миллионов строк), но я покажу вам гораздо меньший пример (24 строки, а не 74513). Итак, допустим, у меня есть 24 строки, каждая с числом с плавающей запятой, после этого 3 числа в одной строке, затем снова 24 строки, строка с 3 числами и так далее 29 раз.

 56.71739
56.67950
56.65762
56.63320
56.61648
56.60323
56.63215
56.74365
56.98378
57.34681
57.78903
58.27959
58.81514
59.38853
59.98271
60.58515
-1.00000
56.09566
56.05496
56.02777
56.00158
55.98341
55.96830
55.99615
          1            1          1
56.34692
56.70977
57.15187
57.64234
58.17782
58.75118
59.34534
59.94779
-1.00000
55.47366
55.42963
55.39739
55.36958
55.35020
55.33404
55.36098
55.47148
55.71110
56.07384
56.51588
57.00632
57.54180
58.11517
58.70937
         2            1           1
  

Довольно просто создать массив из первых 24 строк:

 import numpy

def ttarray_tms (traveltimes):
    '''It defines the 3-D array, organized as I want.'''
    with open (traveltimes, 'r') as file_in:
        newarray = file_in.readlines()
        ttarray = np.array(newarray)
        ttarray.shape = (2,3,4)
        ttarray = np.swapaxes(ttarray,1,2)
        ttarray = np.swapaxes(ttarray,0,2)
        return ttarray
  

ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ: между каждым числом нет пустой строки. Это простой векторный файл с двоеточием. По какой-то причине мне пришлось опубликовать подобное.
Что я хочу, так это в основном получить 29 массивов, поэтому я должен перебрать 24 строки и получить массив, затем снова перебрать следующие 24 строки (переходя к строке с 3 числами, они мне действительно не нужны) и получить еще один массив и так далее. Я думаю, что моя главная проблема заключается в том, как пропустить строку с 3 числами и снова начать новый цикл для нового массива.

У вас есть хорошая идея?

Большое спасибо!

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

1. @smone pilia: Я скорректировал форматирование вашего сообщения. Если у вас возникают трудности, когда вы «Задаете вопрос» (и когда вы отвечаете) ? , прямо над полем редактирования появляется оранжевый цвет. Щелкните по нему, он сообщит вам синтаксис. ( ? На этой странице, ниже здесь, прямо под битом «Ваш ответ», есть оранжевый.)

2. @cwallenpoole: Спасибо за отступ в Python. Пропустил этот бит.

3. Спасибо за это! Я буду делать это в будущем!

Ответ №1:

Вы можете использовать readline() для чтения одной строки 24 раза, затем использовать другую readline() , чтобы пропустить строку и так далее.

С помощью вашего кода:

 import numpy

def mk_array(elems):
    '''Makes the nparray from an array of 24 numbers'''
    ttarray = np.array(elems) # perhaps [ float(a) for a in elems ] is needed
    ttarray.shape = (2,3,4)
    ttarray = np.swapaxes(ttarray,1,2)
    ttarray = np.swapaxes(ttarray,0,2)
    return ttarray

def ttarray_tms(traveltimes):
    '''It defines the 3-D array, organized as I want.'''
    arrays = list()
    with open (traveltimes, 'r') as file_in:
        ret = "." # force the loop
        while ret != "":
            newarray = [ file_in.readline() for i in range(24) ]
            ret = file_in.realine()
            if ret != "": # avoid an empty array
                ttarray = mk_array(newarray)
                arrays.append(ttarray)       
    return arrays
  

Не тестировалось.

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

1. @eikonal это ваш вызов, но я не думаю, что чтение всего файла и обработка большого массива — хорошая идея с точки зрения памяти.

2. можете ли вы попытаться изложить то, что вы говорите, в некоторых строках python, потому что, вероятно, я не понял вашу точку зрения

3. Как я уже сказал, я не понял вашу точку зрения 🙂 Это работает в любом случае, большое спасибо!

Ответ №2:

Числа в строке с тремя наборами следуют возрастающему шаблону. Так почему бы вам не отслеживать этот шаблон, сохраняя последние два числа в двух переменных, и если три соответствуют шаблону, отбросьте их и продолжайте? Это своего рода подход со скользящим окном.

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

1. Есть ли простой способ пропустить строку, которая начинается, например, с пробела?