从文本文件中找到一行的第四个实例,然后截断
Find the fourth instance of a line from a text file, then truncate
我正在尝试重新格式化一个 RSS 文件,该文件的开头经常添加长而复杂的条目。我是一个菜鸟,不知道从哪里开始,所以我一直在这个网站上寻找解决方案,但还没有找到。有些命令对我来说很陌生,但我已经对文件做了很多工作,并按计划下载了一个提要。
我试图在 RSS 提要中找到第四项(由“/item”标记表示),但是,这是我遇到问题的地方,我无法找到答案。
(Python 3)
import time
import sched
import urllib.request
import shutil
scheduler = sched.scheduler(time.time, time.sleep)
def rss():
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen('http://any.website.here/rss') as response, open('test.xml', 'wb') as out_file:
shutil.copyfileobj(response, out_file)
print('Updating RSS')
def trunc():
a = ()
a = open('test.xml', 'r+', encoding = 'utf-8')
c = (0)
for line in a:
if a.readline() == '</item>':
c = c+1
print(c, 'items found!' at )
if c == 4:
return a.tell()
a.seek(0), print(a.read())
a.close
def scheduler_rss():
scheduler.enter(0, 1, rss, ()) # calls rss
scheduler.run()
trunc()
#time.sleep(43200) #time in seconds, this is 12 hours
time.sleep(30) #Variable for testing
for i in range(100):
scheduler_rss()
这只是许多寻找解决方案失败尝试的最新迭代。
无论如何,这是我一直在研究的 RSS...http://nightvale.libsyn.com/rss 它确实按照我的指示将文件复制到我的硬盘驱动器上,然后该文件可以被一个RSS 提要 reader(在我的例子中是一个自动收报机)。基本上,我想我在问:如何找到文件中的位置以从该点开始截断文件,该点是第四次在 .xml 文件中调用标记,请记住提要会定期更新,这个标签不会在每个版本的相同位置?
如果您对其他方法感兴趣,请按以下方法使用 python 的 xml.dom
模块进行操作。您也可以使用 xml.etree
来做到这一点。
from xml.dom.minidom import parse, parseString
dom = parse('test.xml')
... # download and save your xml
items = dom.getElementsByTagName('item')
for item in items:
for child in item.childNodes[:4]:
if len(child.childNodes) > 0:
print(child.tagName + ':', child.firstChild.nodeValue)
为每个 <item>
标签打印类似的东西,直到第 4 个:
title: 110 - Matryoshka
pubDate: Thu, 15 Jun 2017 04:00:00 +0000
guid: ef49bfbd9603243db217053194cc2dc0
link: http://nightvale.libsyn.com/110-matryoshka
...
现在,要截断第 4 个元素之后的所有项目:
parentNode = items[0].parentNode
for i in range(4, len(items)):
parentNode.removeChild(items[i])
dom.writexml(open('test2.xml', 'w'))
我正在尝试重新格式化一个 RSS 文件,该文件的开头经常添加长而复杂的条目。我是一个菜鸟,不知道从哪里开始,所以我一直在这个网站上寻找解决方案,但还没有找到。有些命令对我来说很陌生,但我已经对文件做了很多工作,并按计划下载了一个提要。
我试图在 RSS 提要中找到第四项(由“/item”标记表示),但是,这是我遇到问题的地方,我无法找到答案。
(Python 3)
import time
import sched
import urllib.request
import shutil
scheduler = sched.scheduler(time.time, time.sleep)
def rss():
# Download the file from `url` and save it locally under `file_name`:
with urllib.request.urlopen('http://any.website.here/rss') as response, open('test.xml', 'wb') as out_file:
shutil.copyfileobj(response, out_file)
print('Updating RSS')
def trunc():
a = ()
a = open('test.xml', 'r+', encoding = 'utf-8')
c = (0)
for line in a:
if a.readline() == '</item>':
c = c+1
print(c, 'items found!' at )
if c == 4:
return a.tell()
a.seek(0), print(a.read())
a.close
def scheduler_rss():
scheduler.enter(0, 1, rss, ()) # calls rss
scheduler.run()
trunc()
#time.sleep(43200) #time in seconds, this is 12 hours
time.sleep(30) #Variable for testing
for i in range(100):
scheduler_rss()
这只是许多寻找解决方案失败尝试的最新迭代。
无论如何,这是我一直在研究的 RSS...http://nightvale.libsyn.com/rss 它确实按照我的指示将文件复制到我的硬盘驱动器上,然后该文件可以被一个RSS 提要 reader(在我的例子中是一个自动收报机)。基本上,我想我在问:如何找到文件中的位置以从该点开始截断文件,该点是第四次在 .xml 文件中调用标记,请记住提要会定期更新,这个标签不会在每个版本的相同位置?
如果您对其他方法感兴趣,请按以下方法使用 python 的 xml.dom
模块进行操作。您也可以使用 xml.etree
来做到这一点。
from xml.dom.minidom import parse, parseString
dom = parse('test.xml')
... # download and save your xml
items = dom.getElementsByTagName('item')
for item in items:
for child in item.childNodes[:4]:
if len(child.childNodes) > 0:
print(child.tagName + ':', child.firstChild.nodeValue)
为每个 <item>
标签打印类似的东西,直到第 4 个:
title: 110 - Matryoshka
pubDate: Thu, 15 Jun 2017 04:00:00 +0000
guid: ef49bfbd9603243db217053194cc2dc0
link: http://nightvale.libsyn.com/110-matryoshka
...
现在,要截断第 4 个元素之后的所有项目:
parentNode = items[0].parentNode
for i in range(4, len(items)):
parentNode.removeChild(items[i])
dom.writexml(open('test2.xml', 'w'))