我正在尝试从包含许多其他信息的文本文件中读取波长列表,但是我不知道如何使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']
我知道如何删除特殊字符和换行符,因此我不必担心要读下一行直到点击}。
答案 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)
打开文件,初始化一个容器以获取可能的结果,并表示我们尚未完成
data = open(...)
wavelengths = []
done = False
在数据文件的各行上循环,如果找到'Wavelength'
,则可以开始处理内部循环中的下一行
for line in data:
if line.startswith('Wavelength'):
while True:
我们在内部回路中,寻找波长:一下线,如果节是闭合信号,则表明我们已经完成并跳出内部回路,否则剥离逗号等的波长字符串并追加容器的 value 值
wl = next(data)
if wl.startswith('}'):
done = True
break
wavelenghts.append(float(wl.rstrip(', \n')))
如果我们突破了内循环,则可以停止从数据文件中读取其他行,否则我们将读取另一行。
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
});
});