Python循环不工作时没有输出

时间:2018-01-31 03:26:33

标签: 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>
再次Stack,感谢任何帮助。这项任务大大提高了我对python的学习 - 很高兴让这个小脚本工作!

1 个答案:

答案 0 :(得分:1)

open的'w'参数在每次调用时都会截断文件。你需要'a'。

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

  仅当文件被读取时,

模式可以是'r',仅写入'w'(将删除具有相同名称的现有文件),并且'a'打开文件以进行追加;写入文件的任何数据都会自动添加到最后。 'r +'打开文件进行读写。

此外,似乎lastTime += 10之后的脚本应该缩进到定时循环中,否则你永远不会到达那里。

更新:

仔细观察,我认为你的意思是:

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

否则,第一次参数为false后,while循环退出。

更新2:

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

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

这样做的好处是CPU不会经常循环等待10秒通过,从而为其他进程释放资源。