我正在尝试获取是否要运行的语句,似乎只有第一个将运行,其他语句只是被跳过了。我尝试添加其他动作和虚拟动作,但仍然跳过其他动作。我已经玩了几天,似乎无法检查所有的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的所有信息,找不到与之接近的任何信息。
答案 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} }。