Python合并两行中的项目

时间:2012-03-11 03:32:14

标签: python type-mismatch

如果我有常规格式文件就可以了,如下所示:

  

截止日期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是如何知道它是哪一列的。我该怎么做呢?非常感谢!

2 个答案:

答案 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']