python while循环中只有if语句运行时才有多个if语句

时间:2018-09-03 00:22:43

标签: python

我正在尝试获取是否要运行的语句,似乎只有第一个将运行,其他语句只是被跳过了。我尝试添加其他动作和虚拟动作,但仍然跳过其他动作。我已经玩了几天,似乎无法检查所有的if语句。

#!/usr/bin/env python
#version 1.1 Beta
import maidenhead as mh
from math import radians, sin, cos, acos
import re
import telnetlib
import time
import sys
HOST = "xxxxx" #set your cluster host-name here
PORT = 7300 #cluster port
user = "xxxx" #cluster user
mygrid = "fn10"
sys.stdout.write('\33]0;KM4OUS Cluster Connector\a')
sys.stdout.flush()
tn = telnetlib.Telnet(HOST,PORT)
tn.read_until(b"login: ")
tn.write(user.encode('ascii') + b"\n")
count = 0 
timer = 0
tsb =   "y"
fsb =   "y"
tcw =   "y"
fcw =   "y"
print("Welcome to the KM4OUS Cluster Connector")
while (count < 1):
    fw = open("cluster.csv", "w")
    push = tn.read_very_eager()
    fw.write(push)
    fw.close()
    f = open('cluster.csv','r')
#   
    if fcw == "y":
        regexd = re.compile(r'(DX de .+\s70[2-9].+Z\s\w\w\w\w)')
        for z in f:
            ftcw = regexd.findall(z)
            for ftc in ftcw:
                ftc = re.sub('\'|\,|\(|\)','', str(ftc))
                print(ftc)," \n40M CW DIGI"     

    if tsb == "y":
        regexa = re.compile(r'(DX de .+\s142[2-9].+Z\s\w\w\w\w)|(DX de .+\s143[0-5].+Z\s\w\w\w\w)')
        for x in f:
            twssb = regexa.findall(x)
            for tws in twssb:
                tws = re.sub('\'|\,|\(|\)|\"','', str(tws))
                print(tws),"\n20M SSB"              

    if tcw == "y":
        regexb = re.compile(r'(DX de .+\s140[2-9].Z\s\w\w\w\w)')    
        for xc in f:
            twcw = regexb.findall(xc)
            for twc in twcw:
                twc = re.sub('\'|\,|\(|\)|\"','', str(twc))     
                print(twc)," \n20M CW DIGI" 

    if fsb == "y":
        regexc = re.compile(r'(DX de .+\s717[8-9].Z\s\w\w\w\w)|(DX de .+\s72[0-9].Z\s\w\w\w\w)|(DX de .+\s718.Z\s\w\w\w\w)')
        for y in f:
            forty = regexc.findall(y)
            for fts in forty:
                fts = re.sub('\'|\,|\(|\|\")','', str(fts))
                print(fts)," \n40M SSB"             


    f.close()   
    time.sleep(5)
    if timer == 30:
        print ("\n" + time.ctime() + "\nKM4OUS CLuster Connector\n")

    #cw.close()
    count = 0
    timer = timer+1  

如果有人有一个简单的解决方案,我想听听。这看起来应该很简单,但是却无法正常工作。我查看了ifif和else的所有信息,找不到与之接近的任何信息。

2 个答案:

答案 0 :(得分:0)

在每个if语句下放置打印语句,您将看到它们实际上正在运行。

问题在于,一旦对文件对象进行一次迭代,它将到达末尾。下次您进行迭代时,已经结束了,什么也不做。

您要么需要重置文件位置,要么关闭文件并每次都重新读取。阅读Python教程的I / O部分。 https://docs.python.org/3/tutorial/inputoutput.html

答案 1 :(得分:0)

代码问题不在于if语句,而在于for循环,您已经遍历文件f。这种循环将在您第一次运行文件时消耗文件的内容。如果您尝试在以后的if块之一中再次循环文件,将没有任何循环。

有几种方法可以解决此问题。

一种方法是在if块中打开文件,而不是在while的顶部打开一次。这样,每个内部循环都会获取自己的文件以进行迭代:

# don't open f up here

if fcw == "y":
    regexd = re.compile(r'(DX de .+\s70[2-9].+Z\s\w\w\w\w)')
    with open('cluster.csv','r') as f:
        for z in f:
            ...

if tsb == "y":
    regexa = re.compile(r'(DX de .+\s142[2-9].+Z\s\w\w\w\w)|(DX de .+\s143[0-5].+Z\s\w\w\w\w)')
    for x in f:
        twssb = regexa.findall(x)
        for tws in twssb:
            ...

if tcw == "y":
    regexb = re.compile(r'(DX de .+\s140[2-9].Z\s\w\w\w\w)')    
    with open('cluster.csv','r') as f:
        for xc in f:
           ...

在该代码中,我在每个打开with的地方都使用f语句,因为这将在块结束时自动关闭文件。我建议也将with用于其他文件。

另一种方法是在循环遍历文件对象之前将其倒回开始。您可以使用f.seek(0)进行此操作。我会在您的每个循环之前放一个,因为如果您已经在文件的开头,那么寻找文件的开头并没有什么坏处。请注意,向前和向后搜索的能力是Python中文件的特有功能。大多数迭代器无法做到这一点。它们是一次性的,一旦您消耗掉它们,就无法返回。

最后一个选择是将文件中的行读取到列表或其他数据结构中,然后遍历而不是遍历文件。您可以执行f.readlines()或仅执行list(f)以获得行的列表,并且可以根据需要在列表中进行多次迭代。或者,由于您基于push循环顶部的while变量编写文件的内容,也许您可​​以一起跳过文件,而只使用{{1} }。