如果我有常规格式文件就可以了,如下所示:
截止日期09/30/06/30/03/31/12/31 / 09/30 /
2012 2012 2012 2011 2011
然后我可以通过zip或print "%s%s" % (row_1[j], row_2[j])
但有时我会有这样的不规则输入:
截止日期09/30/2012 06/30 / 03/31/2011 12/31 / 09/30/2012
2011 2010
或者这个:
截止日期09/30/06/30 / 03/31/2011 12/31/2011 09/30/2012
2012 2011
所以最后的日期是row_1和row2列的合并,问题是剂量python是如何知道它是哪一列的。我该怎么做呢?非常感谢!
答案 0 :(得分:0)
有很多方法可以做到这一点,每一种都可以推广到不同类型的输入 - 就像这样。怎么样:
def dates_from_two(line1, line2):
line2 = line2.split()
for word in line1.split():
wsplit = word.split('/')
if len(wsplit) == 3:
yield word if wsplit[-1] else (word + line2.pop(0))
with open("period.txt") as fp:
lines = fp.readlines()
for i, line in enumerate(lines):
if line.startswith("Period End Date"):
next_line = lines[i+1] if i+1 < len(lines) else ''
dates = list(dates_from_two(line, next_line))
print dates
给出(对于你的三个案例):
['09/30/2012', '06/30/2012', '03/31/2012', '12/31/2011', '09/30/2011']
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2010', '09/30/2012']
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2011', '09/30/2012']
基本上,上面将所有行读入内存(不是必需的,但如果文件不是太大则更简单)并循环遍历它们,查找以“Period End Date”开头的行。如果找到一个,它会发送该行,而下一个发送到dates_from_two。
dates_from_two只是循环遍历第1行中的每个单词,并尝试将其拆分为/
。如果它产生三个部分,我们将假设它是一个日期。如果是这样的话,那么如果日期的最后部分是非空的,我们就会产生日期,否则我们得到单词的总和加上第2个第2项(我们弹出)。如果我们从不需要line2,我们从不使用它。请注意,line2.pop(0)
表示“获取第2行的第一个元素然后将其删除”。
答案 1 :(得分:0)
你可以这样做:
import sys
import re
f = open("test1_file")
row_1 = f.readline()
row_2 = f.readline()
print row_1,row_2
row_1 = row_1.split()
row_1 = row_1[3:]
row_2 = row_2.split()
row_2.reverse()
r = re.compile(".+/.+/.+")
dates = []
for date in row_1:
if r.search(date) is None:
new_date = date+row_2.pop()
dates.append(new_date)
else:
dates.append(date)
print dates
当您使用问题中给出的一个示例文件运行时,您将获得以下输出:
Period End Date 09/30/2012 06/30/ 03/31/2011 12/31/ 09/30/2012
2011 2010
['09/30/2012', '06/30/2011', '03/31/2011', '12/31/2010', '09/30/2012']