Python найти подстроку - PullRequest
0 голосов
/ 11 марта 2012

У меня особая работа, вот мой вклад

Period End Date         12/30/    12/31/   12/29/    12/28/    12/31/2007
                         2011      2010     2009      2008

Вы видите, что это неправильный входной файл:

  1. год на второй строчке
  2. но последняя дата верна

Итак, я хочу выкопать правильную дату: 31.12.2011 31.12.2012 31.12.2009 31.12.2008 31.12.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', ...]

Что с этим не так?

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Давайте посмотрим на ваш код:

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 голос
/ 11 марта 2012

Я предполагаю, что число дат варьируется, но всегда состоит из 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']
0 голосов
/ 11 марта 2012

работает

>>> 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', '/' ... и т. Д.

Кроме того, могу ли я предложить некоторые питонные корректировки для вашего кода?используйте 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 как итеративный, который автоматически использует буферизованный ввод-вывод

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...