Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果行中有条件,则加倍。startswith策略_Python_If Statement_Split_Match_Startswith - Fatal编程技术网

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