Python从readlines读取前四行()

时间:2012-02-01 11:11:05

标签: python

如何阅读readlines()的前四行,我从代理到我的脚本的STDIN

GET http://www.yum.com/ HTTP/1.1
Host: www.yum.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Proxy-Connection: keep-alive

我使用sys.stdin.readlines()阅读并将其记录到文件中,但我只想将GETUser-Agent行记录到文件中。

while True:
    line = sys.stdin.readlines()
    for l in line:
        log = open('/tmp/redirect.log', 'a')
        log.write(l)
        log.close()

4 个答案:

答案 0 :(得分:5)

使用with可确保完好关闭日志。 您可以像Python中的任何文件类型对象一样遍历sys.stdin,这样更快,因为它不需要创建列表。

with open('/tmp/redirect.log', 'a') as log:
    while True: #If you need to continuously check for more.
        for line in sys.stdin:
            if line.startswith(("GET", "User-Agent")):
                log.write(line)

以下是一种有效的方法,因为它不会一次又一次地检查相同的行,并且仅在需要剩余的行时进行检查。考虑到这种情况,可能不需要,但如果您有更多要检查的项目,并且需要进行更多事情,那么值得做。它还意味着您可以跟踪您拥有的部件,并且不会超出您需要的范围。如果阅读是一项昂贵的操作,这可能是有价值的。

with open('/tmp/redirect.log', 'a') as log:
    while True: #If you need to continuously check for more.
        needed = {"GET", "User-Agent"}
        for line in sys.stdin:
            for item in needed:
                if line.startswith(item):
                    log.write(line)
                    break
            needed.remove(item)
            if not needed: #The set is empty, we have found all the lines we need.
                break

该集合是无序的,但我们可以假设这些行将按顺序排列,因此按顺序记录。

对于更复杂的行检查(例如:使用正则表达式),也可能需要这种设置。然而,在你的情况下,第一个例子是简洁的,应该运作良好。

答案 1 :(得分:3)

您可以在写入日志之前检查该行的内容:

while True:
    lines = sys.stdin.readlines()
    for line in lines:
        if line.startswith('GET') or line.startswith('User-Agent:'):
            log = open('/tmp/redirect.log', 'a')
            log.write(l)
            log.close()

对于更复杂的检查,您还可以使用正则表达式。

答案 2 :(得分:1)

假设您的输入始终以您想要获得的4行开头,这应该有效:

log = open('/tmp/redirect.log', 'a') 
for l in sys.stdin.readlines()[:4]:
    log.write(l)
log.close()

否则你需要解析输入并可能使用正则表达式(还有另一个答案)。

答案 3 :(得分:1)

>>> lines
0: ['GET http://www.yum.com/ HTTP/1.1',
'Host: www.yum.com',
'User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-gb,en;q=0.5',
'Accept-Encoding: gzip, deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Proxy-Connection: keep-alive']
>>> patterns = ["GET", "User-Agent"]
>>> for line in lines:
...     for pattern in patterns:
...         if line.startswith(pattern):
...             with open("/tmp/redirect.log", "a") as f:
...                 f.write(line)
                break
应该在if语句中使用

with,如果行列表很长,这将导致文件处理程序长时间打开。使用break因为每行只匹配一个模式,如果一行已匹配模式,则无需检查列表中的其他模式。