Python 3.x 如何生成一个从一个字符串开始并以另一个字符串结束的列表?

Python 3.x 如何生成一个从一个字符串开始并以另一个字符串结束的列表?,python-3.x,list,file,Python 3.x,List,File,我试图从包含大量其他信息的文本文件中读取波长列表,但我不知道如何使python只在“波长”之后开始添加到列表中。不过,我可以让它在}结束。我肯定我错过了一些非常明显的东西。我的文本文件的波长存储为以下格式: info1 = {xxx} info2 = {xxx} Wavelength = { 1.1, 2.2, 3.3 } info3 = { 1.1, 2.2 } 我能够通过查找数据所在的行并读取该范围内的数据,将其读入列表,但我希望它更具适应性 wavelength = [] with

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

我知道如何删除特殊字符和新行,因此我不担心这一点,而是在点击}之前阅读下一行。

您可能希望跟踪是否找到“波长”。 您可以将其存储在名为
found\u wave\u length
的变量中,该变量最初为
False
,但一旦找到它,就设置为
True
。只有当
found\u wave\u length
为true时,才能追加行

波长=[]
发现波长=假
以open('file.txt','r')作为hdr:
对于hdr中的行:
如果“波长”在直线上:
发现波长=真
持续
如果在直线中找到波长和“}”:
打破
如果发现波长:
#将下一行添加到列表直到}
波长。追加(行)
打印(波长)

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

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

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)

试着这么做,我得到了一张空名单。这可能是因为我有高于或低于波长的数据。我更新了文本文件的外观。因为拼写很重要。在您的文件中,
波长
以大写字母
W
开头,但不在代码中…抱歉!这通常是我的失败,但即使有了修正,出于某种原因,我仍然得到了一张空名单。我对这个很陌生,所以我确信这是一件小事。编辑代码,忘记我的其他评论。当我发现一个
}
时我正在退出-即使在找到
波长之前发生了这种情况。现在我断言
found\u wave\u length
break
ing退出循环之前是正确的。它仍然返回一个空列表,@Devesh Kumar Singh的解决方案有效。我仍然很好奇我对你的代码做了什么,哈哈。非常感谢。美好的但是数组构造函数不是一个循环吗?;)