目标: - 我需要解析一个带有以下输入的文件,并在状态被批准时获取最新的(builddate timestamp应该是最新的)位置并且builddate是最新的...我提供了示例输入和输出,我有perl中的代码,new to python,请建议如何在python
中实现INPUT:-
Build: M1234BAAAANAAW9321.1
Location: \\dreyers\builds468\INTEGRATION\M1234BAAAANAA9321.1
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 12:51:25
Build: M1234BAAAANAAW9321.2
Location: \\crmbld01\Builds\FAILED\M1234BAAAANAA9321.2
Comments: The build is currently in a failed status.
Status: Failed
BuildDate: 10/25/2012 19:37:17
Build: M1234BAAAANAAW9321.3
Location: \\freeze\builds427\INTEGRATION\M1234BAAAANAA9321.3
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 19:43:28
OUTPUT:-\\freeze\builds427\INTEGRATION\M1234BAAAANAA9321.3
以下是实现的perl代码,我是python的新手,请建议我如何pythonize这段代码
$ echo 'Build: M1234BAAAANAAW9321.1
Location: \\dreyers\builds468\INTEGRATION\M1234BAAAANAAW9321.1
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 12:51:25
Build: M1234BAAAANAAW9321.2
Location: \\crmbld01\Builds\FAILED\M1234BAAAANAAW9321.2
Comments: The build is currently in a failed status.
Status: Failed
BuildDate: 10/25/2012 19:37:17
Build: M1234BAAAANAAW9321.3
Location: \\freeze\builds427\INTEGRATION\M1234BAAAANAAW9321.3
Comments: Build completed, labeled, and marked for retention.
Status: Approved
BuildDate: 10/25/2012 19:43:28
' | perl -e'
local $/ = "";
my ( $build_date, $location );
while ( <> ) {
next unless /status:\s+approved/i;
my $date = sprintf "%04d%02d%02d%02d%02d%02d", ( /builddate:\s+(\d
++)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)\D+(\d+)/i )[ 2, 0, 1, 3, 4, 5 ];
if ( !defined $build_date || $build_date lt $date ) {
( $build_date, $location ) = ( $date, /location:\s+(.+)/i );
}
}
打印“$ location \ n”; “ \冷冻\ builds427 \集成\ M1234BAAAANAAW9321.3
我尝试在python中编写以下内容,似乎没有用,我想知道是否有更好的实现来实现目标..请提示
for line_info in lines:
line_info.find('Location')
if line_info.find('Location') == 0:
# Build Location
print " Found Build location"
logString += " Found Build location\n"
location = line_info.split(" ")
location1 = location[len(location)-1]
elif line_info.find('Status') == 0:
# Status
print " Found Status"
logString += " Found Status\n"
status = line_info.split(" ")
removeEmpty(status)
status1 = status[1].strip()
if status1 != "Approved"
goto .start
elif line_info.find('BuildDate') == 0:
# Main Make
print " Found BuildDate"
logString += " Found BuildDate\n"
builddate1 = line_info.split(" ")
removeEmpty(builddate1)
builddate1 = builddate1[1]
#if builddate1 >
答案 0 :(得分:0)
您可以将问题分成一系列简单的步骤:
实现:
#!/usr/bin/env python
import sys
from datetime import datetime
from itertools import groupby
# find all 'name: value' pairs
file = sys.stdin
pairs = ([s.strip() for s in line.partition(':')[::2]]
for line in file if ':' in line)
# group records
def record_start(pair, count=[False]):
"""Mark start of a record."""
if pair[0] == 'Build':
count[0] = not count[0]
return count[0]
records = (dict(record) for _, record in groupby(pairs, record_start))
approved = (r for r in records if r.get('Status') == 'Approved' and
all(r.get(name) for name in "BuildDate Location".split()))
# find latest record
def get_date(record):
try:
return datetime.strptime(record['BuildDate'], '%m/%d/%Y %H:%M:%S')
except ValueError:
return datetime.min # handle invalid date strings
latest = max(approved, key=get_date)
assert get_date(latest) != datetime.min
print(latest['Location'])
\\freeze\builds427\INTEGRATION\M1234BAAAANAA9321.3
答案 1 :(得分:0)
试试这段代码:
lastLocation = None
lastTime = None
skip = False
bestLocation = None
bestTime = None
for line in text.split('\n'):
line.find('Location')
if line.find('Location') == 0:
# Build Location
skip = False
print " Found Build location"
lastLocation = line.split(":")[1].lstrip()
elif line.find('Status') == 0:
# Status
print " Found Status"
status = line.split(":")
status1 = status[1].strip()
if status1 != "Approved":
skip = True
elif line.find('BuildDate') == 0 and not skip:
# Main Make
print " Found BuildDate"
timeStr = line.split(":", 1)[1].lstrip()
lastTime = datetime.datetime.strptime(timeStr, "%m/%d/%Y %H:%M:%S")
if bestTime == None or bestTime < lastTime:
bestTime = lastTime
bestLocation = lastLocation
print lastLocation