Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 输出文件仅包含来自一次迭代的数据_Python_Xml_Parsing_For Loop_Elementtree - Fatal编程技术网

Python 输出文件仅包含来自一次迭代的数据

Python 输出文件仅包含来自一次迭代的数据,python,xml,parsing,for-loop,elementtree,Python,Xml,Parsing,For Loop,Elementtree,该脚本仅获取一个站点的天气信息。我想获得链接中列出的所有值,并将这些值以下面脚本中的格式写入文件 #! /usr/bin/python #import module to open urls from urllib import urlopen #import module to parse xml import xml.etree.ElementTree as ET #settings airport = 'KORF,KPHF,KRIC,KDCA,KIAD,KADW,KBWI,KACY,

该脚本仅获取一个站点的天气信息。我想获得链接中列出的所有值,并将这些值以下面脚本中的格式写入文件

#! /usr/bin/python

#import module to open urls
from urllib import urlopen

#import module to parse xml
import xml.etree.ElementTree as ET

#settings
airport = 'KORF,KPHF,KRIC,KDCA,KIAD,KADW,KBWI,KACY,KPHL,KMDT,KPIT,KEWR,KJFK,KLGA,KBOS'

#open xml file
xml_link = urlopen('http://weather.aero/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&hoursBeforeNow=1&stationString=KORF,KPHF,KRIC,KDCA,KIAD,KADW,KBWI,KACY,KPHL,KMDT,KPIT,KEWR,KJFK,KLGA,KBOS')

#parse data and assign root to element tree module
tree = ET.parse(xml_link)
root = tree.getroot()

#search for data under <data> and <METAR> tags
data = root.findall('data/METAR')

for metar in data:
    raw_text = metar.find('raw_text').text
    station = metar.find('station_id').text
    category = metar.find('flight_category').text

    file = open('metar.txt', 'w')
    file.write("%s is now reporting %s condition:" % (station, category))
    file.write("\n%s" %raw_text)
    file.close()
#/usr/bin/python
#导入模块以打开URL
从urllib导入urlopen
#导入模块以解析xml
将xml.etree.ElementTree作为ET导入
#背景
机场='KORF,KPHF,KRIC,KDCA,KIAD,KADW,KBWI,KACY,KPHL,KMDT,KPIT,KEWR,KJFK,KLGA,KBOS'
#打开xml文件
xml_link=urlopen('http://weather.aero/dataserver_current/httpparam?dataSource=metars&requestType=retrieve&format=xml&hoursBeforeNow=1&stationString=KORF,KPHF,KRIC,KDCA,KIAD,KADW,KBWI,KACY,KPHL,KMDT,KPIT,KEWR,KJFK,KLGA,KBOS')
#解析数据并将根分配给元素树模块
tree=ET.parse(xml\u链接)
root=tree.getroot()
#在和标记下搜索数据
data=root.findall('data/METAR'))
对于数据中的metar:
原始文本=metar.find('raw_-text').text
station=metar.find('station_id')。文本
category=metar.find('flight_category')。文本
file=open('metar.txt','w')
file.write(“%s”正在报告%s状况:”%(站点,类别))
文件。写入(“\n%s”%raw\u text)
file.close()文件
如中所述,问题不在于如何迭代XML值,而在于每次通过循环时都会覆盖
metar.txt

您应该在循环之外打开和关闭文件。
with
语句可以在这里帮助您完成以下工作:

with open('metar.txt', 'w') as f:
    for metar in data:
        raw_text = metar.find('raw_text').text
        station = metar.find('station_id').text
        category = metar.find('flight_category').text

        f.write("%s is now reporting %s condition:" % (station, category))
        f.write("\n%s" %raw_text)

(您也不应该使用
file
作为文件对象的名称,因为
file
是文件对象的内置Python类型,如果这样做,您将对其进行阴影处理。)

您的代码已经对所有条目进行了迭代。问题是,它会从头开始为每个文件重写文件。在循环之前只打开一次文件,在循环过程中写入(就像你已经做的那样),在循环之后关闭它,你就会没事了。顺便说一句,我倾向于关闭这个文件,因为它“太本地”——它不会帮助任何想从XML文件中获取多个值的人,因为这不是问题所在。仅仅因为他错误地诊断了他的编程问题,这并不意味着他的问题过于局限。许多人误解了打开文件的工作原理,这可能很有价值。