我有一项非常特殊的工作要做,这是我的输入
Period End Date 12/30/ 12/31/ 12/29/ 12/28/ 12/31/2007
2011 2010 2009 2008
您可以看到这是一个错误的输入文件:
所以我想挖出正确的日期: 12/31/2011 12/31/2012 12/31/2009 12/31/2008 12/31/2007
这是我想要做的事情
input_file = open("input", "r")
for line in input_file:
index = line.find("Period End Date", 0)
if index != -1:
line = line[index+len("Period End Date"):len(line)]
temp_line = " ".join(line.split())
temp_line.split(" ")
year_line= input_file.next()
#remove space, split,append on temp_line[i]
但它不起作用:
temp_line.split(" ")
返回['1','2','/', ...]
而不是['12/31/', '12/30', ...]
这有什么不对?
答案 0 :(得分:2)
让我们来看看你的代码:
temp_line = " ".join(line.split())
用一个空格替换多个空格。到目前为止,好吧。下一行:
temp_line.split(" ")
现在怎样?在单一空间再次拆分?这只会逆转您之前所做的联接。你为什么不坚持使用line.split()
呢?此外,您没有将结果分配回temp_line
,因此结果是丢弃,这可能是此处的主要问题。
你可以使用类似的东西:
with open("input", "rb") as f:
lines = list(f)
for date_line, year_line in zip(lines, lines[1:])[::2]:
parts = date_line.strip().split()
if ' '.join(parts[0:3]) != 'Period End Date': continue
dates, years = parts[3:], year_line.strip().split()[1:]
year_index = 0
for date in dates:
if not date.split('/')[-1]:
date = date + years[year_index]
year_index += 1
print date
答案 1 :(得分:1)
我将假设日期的数量有所不同,但总是包含N个日期月份条目,然后是完整的日 - 月 - 年份条目,其次是N年条目:
def getHeadings(s):
head = s.split()
num_dates = (len(head) - 4)/2
return [dm+y for dm,y in zip(head[3:3+num_dates], head[4+num_dates:])] + head[3+num_dates:4+num_dates]
getHeadings(""" Period End Date 12/30/ 12/31/ 12/29/ 12/28/ 12/31/2007
2011 2010 2009 2008""")
返回
['12/30/2011', '12/31/2010', '12/29/2009', '12/28/2008', '12/31/2007']
答案 2 :(得分:0)
它有效
>>> temp_line = " ".join(line.split())
>>> temp_line
'12/30/ 12/31/ 12/29/ 12/28/ 12/31/2007'
>>> temp_line.split(" ")
['12/30/', '12/31/', '12/29/', '12/28/', '12/31/2007']
如果您正在迭代temp_line
中的每个项目,那么您将获得'1','2','/'等等。
另外,我可以建议您对代码进行一些pythonic调整吗?使用line.split('Period End Date ')[1].strip().split(" ")
代替
line = line[index+len("Period End Date"):len(line)]
temp_line = " ".join(line.split())
temp_line.split(" ")
Plus file
是python中的迭代器,你可以简单地做 -
with open(...) as f:
for line in f:
<do something with line>
with
语句处理打开和关闭文件,包括是否在内部块中引发异常。 for line in f
将文件对象f视为可迭代,它自动使用缓冲的IO