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

时间:2019-05-24 13:28:31

标签: python-3.x list file

我正在尝试从包含许多其他信息的文本文件中读取波长列表,但是我不知道如何使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']

我知道如何删除特殊字符和换行符,因此我不必担心要读下一行直到点击}。

6 个答案:

答案 0 :(得分:1)

您可以遍历文件,获取所有行,然后找到 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]

答案 1 :(得分:0)

您可能想要跟踪是否已找到“波长”。 您可以将其存储在名为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)

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

另一个没有循环的解决方案。所有字符串方法都可以链接在一起以实现紧凑性。

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

答案 4 :(得分:0)

  1. 打开文件,初始化一个容器以获取可能的结果,并表示我们尚未完成

    data = open(...)
    wavelengths = []
    done = False
    
  2. 在数据文件的各行上循环,如果找到'Wavelength',则可以开始处理内部循环中的下一行

    for line in data:
        if line.startswith('Wavelength'):
            while True:
    
  3. 我们在内部回路中,寻找波长:一下线,如果节是闭合信号,则表明我们已经完成并跳出内部回路,否则剥离逗号等的波长字符串并追加容器的 value

                wl = next(data)
                if wl.startswith('}'):
                    done = True
                    break
                wavelenghts.append(float(wl.rstrip(', \n')))
    
  4. 如果我们突破了内循环,则可以停止从数据文件中读取其他行,否则我们将读取另一行。

        if done: break
    

答案 5 :(得分:0)

这是一个简单的简短版本。就像您说的那样,在“ Wavelength”之后开始,在“}”处结束,文件中还有许多其他信息。

var loader = new THREE.FontLoader();
loader.load('../Libraries/three.js-master/examples/fonts/gentilis_bold.typeface.json', function(font) {

  var geometry = new THREE.TextGeometry('Hello three.js!', {
    font: font,
    size: 80,
    height: 1,
    curveSegments: 12,
    bevelEnabled: true,
    bevelThickness: 10,
    bevelSize: 8,
    bevelOffset: 0,
    bevelSegments: 5
  });
});