#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. Есть ли простой способ пропустить строку, которая начинается, например, с пробела?