Python 3.x 如何生成一个从一个字符串开始并以另一个字符串结束的列表?
我试图从包含大量其他信息的文本文件中读取波长列表,但我不知道如何使python只在“波长”之后开始添加到列表中。不过,我可以让它在}结束。我肯定我错过了一些非常明显的东西。我的文本文件的波长存储为以下格式: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
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的解决方案有效。我仍然很好奇我对你的代码做了什么,哈哈。非常感谢。美好的但是数组构造函数不是一个循环吗?;)