【问题标题】:python Multiple if statements in while loop only first if statement runspython while循环中的多个if语句仅第一个if语句运行
【发布时间】:2018-09-03 00:22:43
【问题描述】:

我正在尝试运行 if 语句,但似乎只有第一个语句会运行,其他语句只是被跳过。我尝试添加其他和虚拟动作,但仍然跳过另一个。我已经玩了几天了,似乎无法让它检查所有的 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  

如果有人有简单的解决方案,我想听听。这看起来应该很简单,但它没有按预期工作。我查找了有关 if elif 和 else 的所有信息,但找不到与此相关的任何信息。

【问题讨论】:

  • 我只是试图通过将 fcw 等定义为“y”然后对每个都运行 ifs 来复制我的基本问题。这没有问题,所以我不认为这个问题直接与ifs有关。我强烈建议您重新开始并重新构建复杂性,或者尝试从当前程序中删除部分内容(当然是在保存副本之后),看看您是否可以找到在什么时候停止获得预期的行为。
  • 让我想起了 this 页面上的一个故事(搜索“在大学里,我曾担任过”)

标签: python


【解决方案1】:

您的代码的问题不在于if 语句,而在于您对文件ffor 循环。这种循环将在您第一次运行时消耗文件的内容。如果您尝试在后面的 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:
           ...

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

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

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

【讨论】:

  • 尝试了 f.seek(0) 但可能没有做对但是 with open 非常感谢您的帮助。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2015-05-19
    • 2013-03-11
    • 2016-07-10
    • 2014-08-20
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多