如何从字符串开始并以另一个结尾生成列表



我正在尝试读取包含许多其他信息的文本文件中的波长列表'。但是,我可以在}上结束。我敢肯定,我缺少一些痛苦的明显。我的文本文件具有以这种格式存储的波长:

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']

我知道如何删除特殊字符和新线条,所以我不担心这么多,就像阅读下一行直到我击中}。

您可以通过文件迭代并获取所有行,然后找到 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]

一种方法是简单地检查当前行是否是数字。

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)(。

您可能需要跟踪是否找到'波长'。您可以将其存储在最初是False的名为found_wave_length的变量中,但是一旦找到它,就将其设置为True。如果found_wave_length为true,则仅附加行。

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)

其他没有任何循环的解决方案。所有字符串方法都可以链接在一起以使其紧凑。

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

这是一个简单的简短版本。就像您说的那样,在"波长"之后开始,以"}"结束,文件中的许多其他信息。

    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)

相关内容

最新更新