Python 如果行中有条件,则加倍。startswith策略
我有一个Python 如果行中有条件,则加倍。startswith策略,python,if-statement,split,match,startswith,Python,If Statement,Split,Match,Startswith,我有一个data.dat文件,格式如下: REAL PART FREQ 1.6 5.4 2.1 13.15 13.15 17.71 FREQ 51.64 51.64 82.11 133.15 133.15 167.71 . . . IMAGINARY PART FREQ 51.64 51.64 82.12 132.15 129.15 161.71 FREQ 5.64
data.dat
文件,格式如下:
REAL PART
FREQ 1.6 5.4 2.1 13.15 13.15 17.71
FREQ 51.64 51.64 82.11 133.15 133.15 167.71
.
.
.
IMAGINARY PART
FREQ 51.64 51.64 82.12 132.15 129.15 161.71
FREQ 5.64 51.64 83.09 131.15 120.15 160.7
.
.
.
REAL PART
FREQ 1.6 5.4 2.1 13.15 15.15 17.71
FREQ 51.64 57.64 82.11 183.15 133.15 167.71
.
.
.
IMAGINARY PART
FREQ 53.64 53.64 81.12 132.15 129.15 161.71
FREQ 5.64 55.64 83.09 131.15 120.15 160.7
整个文档中都报告了实
和虚
块
在实部
块中
我想拆分以FREQ
开头的每一行
我已设法:
1) 拆分行并提取FREQ
的值,然后
2) 将此结果附加到列表列表中,然后
3) 创建最终列表,所有频率
:
FREQ = []
fname ='data.dat'
f = open(fname, 'r')
for line in f:
if line.startswith(' FREQ'):
FREQS = line.split()
FREQ.append(FREQS)
print 'Final FREQ = ', FREQ
All_frequencies = list(itertools.chain.from_iterable(FREQ))
print 'All_frequencies = ', All_frequencies
此代码的问题在于,它还提取频率
的虚部
值。只需提取FREQ
的实部
值
我试着做一些类似的事情:
if line.startswith('REAL PART'):
if line.startswith('IMAGINARY PART'):
code...
或:
但这是行不通的。如果您能帮助我,我将不胜感激我们首先将标志设置为
False
。如果我们找到一行包含“REAL”,我们将其设置为True
开始复制实部下方的数据,直到我们找到一行包含virtual,这将标志设置为False
,并转到下一行,直到找到另一个“REAL”(因此标志变回True
)
以简单的方式使用标志概念:
with open('this.txt', 'r') as content:
my_lines = content.readlines()
f=open('another.txt', 'w')
my_real_flag = False
for line in my_lines:
if "REAL" in line:
my_real_flag = True
elif "IMAGINARY" in line:
my_real_flag = False
if my_real_flag:
#do code here because we found real frequencies
f.write(line)
else:
continue #because my_real_flag isn't true, so we must have found a
f.close()
this.txt如下所示:
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
REAL
1
2
3
另一个.txt的结果如下所示:
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
REAL
1
2
3
只有在有一个真实部分时才有效的原始答案 如果文件“小”到可以作为整个字符串读取,并且只有一个“虚部”实例,则可以执行以下操作:
file_str = file_str.split("IMAGINARY PART")[0]
这会让你的一切都超出“想象部分”的界限
然后,您可以将代码的其余部分应用于这个仅包含真实部分的文件字符串
更详细地说,file_str是通过以下方式获得的str:
with open('data.dat', 'r') as my_data:
file_str = my_data.read()
“with”块在整个堆栈交换中都被引用,因此对它的解释可能比我的更好。我直观地认为它是“打开一个名为'data.dat'的文件,该文件只能读取它并将其命名为变量my_data。一旦打开它,使用my_data.read()将整个文件读入一个str,file_str,然后关闭'data.dat'” 现在您有了一个str,您可以对其应用所有适用的str函数 如果“虚部”在整个文件中频繁出现,或者文件太大,Tadgeh建议的标志a break很有效
for line in f:
if "IMAGINARY PART" not in line:
#do stuff
else:
f.close()
break
我们从设置为
False
的标志开始。如果我们找到一行包含“REAL”,我们将其设置为True
开始复制实部下方的数据,直到我们找到一行包含virtual,这将标志设置为False
,并转到下一行,直到找到另一个“REAL”(因此标志变回True
)
以简单的方式使用标志概念:
with open('this.txt', 'r') as content:
my_lines = content.readlines()
f=open('another.txt', 'w')
my_real_flag = False
for line in my_lines:
if "REAL" in line:
my_real_flag = True
elif "IMAGINARY" in line:
my_real_flag = False
if my_real_flag:
#do code here because we found real frequencies
f.write(line)
else:
continue #because my_real_flag isn't true, so we must have found a
f.close()
this.txt如下所示:
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
REAL
1
2
3
另一个.txt的结果如下所示:
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
IMAGINARY
4
5
6
REAL
1
2
3
REAL
1
2
3
只有在有一个真实部分时才有效的原始答案 如果文件“小”到可以作为整个字符串读取,并且只有一个“虚部”实例,则可以执行以下操作:
file_str = file_str.split("IMAGINARY PART")[0]
这会让你的一切都超出“想象部分”的界限
然后,您可以将代码的其余部分应用于这个仅包含真实部分的文件字符串
更详细地说,file_str是通过以下方式获得的str:
with open('data.dat', 'r') as my_data:
file_str = my_data.read()
“with”块在整个堆栈交换中都被引用,因此对它的解释可能比我的更好。我直观地认为它是“打开一个名为'data.dat'的文件,该文件只能读取它并将其命名为变量my_data。一旦打开它,使用my_data.read()将整个文件读入一个str,file_str,然后关闭'data.dat'” 现在您有了一个str,您可以对其应用所有适用的str函数 如果“虚部”在整个文件中频繁出现,或者文件太大,Tadgeh建议的标志a break很有效
for line in f:
if "IMAGINARY PART" not in line:
#do stuff
else:
f.close()
break
您需要跟踪正在查看的零件,因此可以使用标志执行此操作:
section = None #will change to either "real" or "imag"
for line in f:
if line.startswith("IMAGINARY PART"):
section = "imag"
elif line.startswith('REAL PART'):
section = "real"
else:
freqs = line.split()
if section == "real":
FREQ.append(freqs)
#elif section == "imag":
# IMAG_FREQ.append(freqs)
顺便说一下,代替<代码>附录< /代码> ING到<代码> Frq然后需要使用<代码> ItTraves.Cu链。
section = None #will change to either "real" or "imag"
for line in f:
if line.startswith("IMAGINARY PART"):
section = "imag"
elif line.startswith('REAL PART'):
section = "real"
else:
freqs = line.split()
if section == "real":
FREQ.append(freqs)
#elif section == "imag":
# IMAG_FREQ.append(freqs)
<顺便说一下,代替<代码>附录< /代码> ING到<代码> Frq然后需要使用<代码> ItdioStudio.Cu链。在一种状态下,当程序读取一行开始时为实数时,它进入实数状态并聚合值。当它读取带有虚值的行时,它进入备用状态并忽略值
REAL, IMAGINARY = 1,2
FREQ = []
fname = 'data.dat'
f = open(fname)
state = None
for line in f:
line = line.strip()
if not line: continue
if line.startswith('REAL'):
state = REAL
continue
elif line.startswith('IMAGINARY'):
state = IMAGINARY
continue
else:
pass
if state == IMAGINARY:
continue
freqs = line.split()[1:]
FREQ.extend(freqs)
我假设您只需要数值;因此,在脚本末尾附近的freqs赋值结束时的[:1]
使用数据文件(不带省略号行)在FREQ中生成以下结果:
['1.6','5.4','2.1','13.15','13.15','17.71','51.64','51.64','82.11','133.15','133.15','167.71','1.6','5.4','2.1','13.15','15.15','17.71','51.64','57.64','82.11','183 183.15','133.15','167.71']将其视为一个具有两种状态的状态机。在一种状态下,当程序读取一行开始时为实数时,它进入实数状态并聚合值。当它读取带有虚值的行时,它进入备用状态并忽略值
REAL, IMAGINARY = 1,2
FREQ = []
fname = 'data.dat'
f = open(fname)
state = None
for line in f:
line = line.strip()
if not line: continue
if line.startswith('REAL'):
state = REAL
continue
elif line.startswith('IMAGINARY'):
state = IMAGINARY
continue
else:
pass
if state == IMAGINARY:
continue
freqs = line.split()[1:]
FREQ.extend(freqs)
我假设您只需要数值;因此,在脚本末尾附近的freqs赋值结束时的[:1]
使用数据文件(不带省略号行)在FREQ中生成以下结果:
['1.6','5.4','2.1','13.15','13.15','17.71','51.64','51.64','82.11','133.15','133.15','16