Как создать список, начиная со строки и заканчивая другой? - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь прочитать список длин волн из текстового файла, содержащего много другой информации, но я не могу понять, как заставить Python только начать добавлять в список после «длины волны».Я могу закончить это на} однако.Я уверен, что упускаю что-то мучительно очевидное.Мой текстовый файл имеет длины волн, сохраненные в этом формате:

info1 = {xxx}
info2 = {xxx}

Wavelength = {
1.1,
2.2,
3.3
}

info3 = {
1.1,
2.2
}

Я смог получить его для чтения в список, найдя строки, в которых были данные, и прочитав в этом диапазоне, но я хочу, чтобы это былоболее адаптируемый.

wavelength = []
with open(header, 'r') as hdr:
    for line in hdr:
        if 'wavlength' in line:
            #add next lines to list until }
            if float in line:
                if '}' in line:
                    break
    wavelength.append(line)
print(wavelength)

#output I want
[1.1,2.2,3.3]
#output I get
['}\n']

Я знаю, как удалять специальные символы и новые строки, так что я не беспокоюсь об этом так сильно, как читаю следующие строки, пока не нажму}.

Ответы [ 5 ]

1 голос
/ 24 мая 2019

Вы можете пройтись по файлу и получить все строки, затем найти индексы Wavelength = { и следующие }, а затем выбрать числа с плавающей точкой между ними.Получение всех строк также поможет вам, если вы хотите обработать больше данных, используя строки позже

wavelength = []

with open('file.txt', 'r') as hdr:
    lines = [line.strip() for line in hdr.readlines() if line.strip()]

#Find the index of Wavelength = {
start_idx = lines.index('Wavelength = {')

#Find the index of next }
end_idx = lines.index('}',start_idx)

#Get all floats between those indexes
wavelength = [float(item.strip(',')) for item in lines[start_idx+1:end_idx]]
print(wavelength)

Вывод будет

[1.1, 2.2, 3.3]
0 голосов
/ 24 мая 2019

Вот простая короткая версия.Начните после «Wavelength», заканчивайте на «}», множеством другой информации в файле, как вы и сказали.

    wavelength = []
    flag = 0
    for line in open('wavefile.txt','r'):
        if '}' in line:
            flag = 0
        if 'Wavelength' in line:
            flag = 1
            continue
        if flag == 1:
            wavelength.append(line.strip())

    print(wavelength)
0 голосов
/ 24 мая 2019

Еще одно решение без петель.Все строковые методы могут быть объединены для компактности.

with open(header, 'r') as f:
    s = f.read()
temp = s.partition('Wavelength = {')[2] # Get everything after 'Wavelength = {'
temp = temp.partition('}')[0]           # Get everything before the following '}'
temp = temp.split(',\n')                # Separate individual numbers
wavelength = [float(k) for k in temp]   # Convert to float
0 голосов
/ 24 мая 2019

Один из способов - просто проверить, является ли текущая строка числом.

for line in hdr.splitlines():
    try:
        num = float(line)
    except ValueError:
        pass
    else:
        wavelength.append(num)

Квадратные скобки и формат файла не учитываются, но это можно реализовать, установив логический флаг.

switch = False
...
with open('file.txt', 'r') as hdr:
    for line in hdr.splitlines():
        if switch:
            wavelength.append(num)

        if 'Wavelength' in line and '{' in line:
            switch = True
        elif '}' in line:
            switch = False

И вы можете использовать регулярные выражения, чтобы привести их в порядок, если хотите (например, re.search('Wavelength *{', line)).

0 голосов
/ 24 мая 2019

Вы, вероятно, захотите отследить, нашли ли вы «длину волны» или нет.Вы можете сохранить его в переменной с именем found_wave_length, которая изначально False, но как только вы ее найдете, установите значение True.Вы только добавляете строки, если found_wave_length истинно.

wavelength = []
found_wave_length = False
with open('file.txt', 'r') as hdr:
    for line in hdr:
        if 'Wavelength' in line:
            found_wave_length = True
            continue

        if found_wave_length and '}' in line:
            break

        if found_wave_length:
            #add next lines to list until }
            wavelength.append(line)
print(wavelength)
...