Python While循环不工作,没有输出

2024-04-26 05:53:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用while循环使脚本每10分钟左右运行一次(在本例中,为了理解它是否工作,缩短了运行时间)。你知道吗

它不会工作,我不知道为什么-很难理解到底是什么不工作。基本上它运行没有一个问题,但没有什么是进入CSV文件我试图保存。理想情况下,我希望它也保存在一行中,然后用每个循环下一行。提前谢谢!你知道吗

from lxml import etree
import urllib.request
import csv
#import threading un-need at the moment.
import time

#Pickle is not needed
#append to list next
def handleLeg(leg):

   # print this leg as text, or save it to file maybe...
   #text = etree.tostring(leg, pretty_print=True)
   # also process individual elements of interest here if we want

   tagsOfInterest=["noTrafficTravelTimeInSeconds", "lengthInMeters", "departureTime", "trafficDelayInSeconds"]  # whatever

   #list to use for data analysis
   global data
   data = []
   #create header dictionary that includes the data to be appended within it. IE, Header = {TrafficDelay[data(0)]...etc
   for child in leg:
       if 'summary' in child.tag:
          for elem in child:
              for item in tagsOfInterest:
                  if item in elem.tag:
                      data.append(elem.text)



 #Parse the xml
#Threading way to run every couple of seconds
#threading.Timer(5.0, parseXML, ["xmlFile"]).start()
def parseXML(xmlFile):
    lastTime = time.time() - 10
    while time.time() >= lastTime + 10:
        lastTime += 10
        with urllib.request.urlopen("https://api.tomtom.com/routing/1/calculateRoute/-37.79205923474775,145.03010268799338:-37.798883995180496,145.03040309540322:-37.807106781970354,145.02895470253526:-37.80320743019992,145.01021142594075:-37.7999012967757,144.99318476311566:?routeType=shortest&key=HerpinaLongbottom&computeTravelTimeFor=all") as fobj:
            xml = fobj.read()
        root = etree.fromstring(xml)
        for child in root:
            if 'route' in child.tag:
                handleLeg(child)

           # Write CSV file
                with open('datafile.csv', 'a') as fp:
                    writer = csv.writer(fp, delimiter=' ')
            # writer.writerow(["your", "header", "foo"])  # write header
                    writer.writerows(data)
                with open('datafile.csv', 'r') as fp:
                    reader = csv.reader(fp, quotechar='"')
        # next(reader, None)  # skip the headers
                    data_read = [row for row in reader]
                print(data_read)


if __name__ == "__main__":
   parseXML("xmlFile")

"""with open('datafile.csv', 'r') as fp:
    reader = csv.reader(fp, quotechar='"')
    # next(reader, None)  # skip the headers
    data_read = [row for row in reader]

print(data_read)"""

这是一个它所拉入的XML示例,因为我显然无法向我使用的API提供代码。你知道吗

<calculateRouteResponse xmlns="http://api.tomtom.com/routing" formatVersion="0.0.12">
<copyright>...</copyright>
<privacy>...</privacy>
<route>
<summary>
<lengthInMeters>5144</lengthInMeters>
<travelTimeInSeconds>687</travelTimeInSeconds>
<trafficDelayInSeconds>0</trafficDelayInSeconds>
<departureTime>2018-01-16T11:16:06+11:00</departureTime>
<arrivalTime>2018-01-16T11:27:33+11:00</arrivalTime>
<noTrafficTravelTimeInSeconds>478</noTrafficTravelTimeInSeconds>
<historicTrafficTravelTimeInSeconds>687</historicTrafficTravelTimeInSeconds>
<liveTrafficIncidentsTravelTimeInSeconds>687</liveTrafficIncidentsTravelTimeInSeconds>
</summary>
<leg>
<summary>
<lengthInMeters>806</lengthInMeters>
<travelTimeInSeconds>68</travelTimeInSeconds>
<trafficDelayInSeconds>0</trafficDelayInSeconds>
<departureTime>2018-01-16T11:16:06+11:00</departureTime>
<arrivalTime>2018-01-16T11:17:14+11:00</arrivalTime>
<noTrafficTravelTimeInSeconds>59</noTrafficTravelTimeInSeconds>
<historicTrafficTravelTimeInSeconds>68</historicTrafficTravelTimeInSeconds>
<liveTrafficIncidentsTravelTimeInSeconds>68</liveTrafficIncidentsTravelTimeInSeconds>
</summary>
<points>...</points>
</leg>
<leg>
<summary>
<lengthInMeters>958</lengthInMeters>
<travelTimeInSeconds>114</travelTimeInSeconds>
<trafficDelayInSeconds>0</trafficDelayInSeconds>
<departureTime>2018-01-16T11:17:14+11:00</departureTime>
<arrivalTime>2018-01-16T11:19:08+11:00</arrivalTime>
<noTrafficTravelTimeInSeconds>77</noTrafficTravelTimeInSeconds>
<historicTrafficTravelTimeInSeconds>114</historicTrafficTravelTimeInSeconds>
<liveTrafficIncidentsTravelTimeInSeconds>114</liveTrafficIncidentsTravelTimeInSeconds>
</summary>
<points>...</points>
</leg>
<leg>
<summary>
<lengthInMeters>1798</lengthInMeters>
<travelTimeInSeconds>224</travelTimeInSeconds>
<trafficDelayInSeconds>0</trafficDelayInSeconds>
<departureTime>2018-01-16T11:19:08+11:00</departureTime>
<arrivalTime>2018-01-16T11:22:53+11:00</arrivalTime>
<noTrafficTravelTimeInSeconds>181</noTrafficTravelTimeInSeconds>
<historicTrafficTravelTimeInSeconds>224</historicTrafficTravelTimeInSeconds>
<liveTrafficIncidentsTravelTimeInSeconds>224</liveTrafficIncidentsTravelTimeInSeconds>
</summary>
<points>...</points>
</leg>
<leg>
<summary>
<lengthInMeters>1582</lengthInMeters>
<travelTimeInSeconds>280</travelTimeInSeconds>
<trafficDelayInSeconds>0</trafficDelayInSeconds>
<departureTime>2018-01-16T11:22:53+11:00</departureTime>
<arrivalTime>2018-01-16T11:27:33+11:00</arrivalTime>
<noTrafficTravelTimeInSeconds>160</noTrafficTravelTimeInSeconds>
<historicTrafficTravelTimeInSeconds>280</historicTrafficTravelTimeInSeconds>
<liveTrafficIncidentsTravelTimeInSeconds>280</liveTrafficIncidentsTravelTimeInSeconds>
</summary>
<points>...</points>
</leg>
<sections>
<section>
<startPointIndex>0</startPointIndex>
<endPointIndex>139</endPointIndex>
<sectionType>TRAVEL_MODE</sectionType>
<travelMode>car</travelMode>
</section>
</sections>
</route>
</calculateRouteResponse>

再次感谢您的帮助。这个任务极大地提高了我对python的学习——很高兴这个小脚本能正常工作!你知道吗


Tags: csvindatasummarypointsreaderlegdeparturetime
1条回答
网友
1楼 · 发布于 2024-04-26 05:53:58

open的'w'参数每次调用时都会截断文件。你需要一个“a”。你知道吗

https://docs.python.org/3/tutorial/inputoutput.html

mode can be 'r' when the file will only be read, 'w' for only writing (an existing file with the same name will be erased), and 'a' opens the file for appending; any data written to the file is automatically added to the end. 'r+' opens the file for both reading and writing.

而且,似乎lastTime += 10之后的脚本应该缩进到计时循环中,否则就永远无法到达那里。你知道吗

更新:

仔细看,我想你的意思是:

lastTime = time.time() - 10
while True:       
    if time.time() >= lastTime + 10: 
        # repeated action here
        lastTime = time.time()

否则,while循环在参数第一次为false之后退出。你知道吗

更新2:

实际上,更简单的方法是:

 while True:
    # repeated action here
    time.sleep(10)

这还有一个好处,就是你的CPU不会一直循环等待10秒,从而为其他进程释放资源。你知道吗

相关问题 更多 >