2013-07-31 4 views
0

Вот текстовый файлPython текстовый файл форматирования

apple1 
apple2 
apple3 
date with apple 
flower1 
flower2 
flower3 
flower4 
date with flower 
dog1 
dog2 
date with dog 

Мне нужен код питона, который помогает мне превратить файл во что-то вроде этого

apple1|date with apple 
apple2|date with apple 
apple3|date with apple 
flower1|date with flower 
flower2|date with flower 
flower3|date with flower 
flower4|date with flower 
dog1|date with dog 
dog2|date with dog 

это, вероятно, потребуется вложенный цикл, тот, который подсчитывается до строки.startswith «date», а затем, когда он туда добирается, он присоединяет каждую строку до этого, после чего счетчик начинается, когда x находится между диапазоном 0 и общим количеством строк. Идеи?

+1

Что вам нужна помощь, или вы просто просите кого-то, чтобы написать код для вас? Есть ли конкретный аспект этой проблемы, который вы не понимаете? –

ответ

1

Мое решение требует список, который содержит вещи, которые не начинаются с даты.

f = open('apple.txt') 
lines = f.readlines() 
f.close() 
things = [] 
printtofile = [] 
for i in lines: 
    things.append(i) 
    if i.startswith('date'): 
     things.pop() 
     for x in things: 
      if i[:-1] == '\n': 
       printtofile.append(x[:-1]+'|'+i[:-1]) 
      else: 
       printtofile.append(x[:-1]+'|'+i) 
     things = [] 
print printtofile 
writefile = open('file.txt', 'w') 
writefile.writelines(printtofile) 
writefile.close() 

Надеется, что это помогает, Python 2.7

+0

это работает. Спасибо – Monz

+0

Как я могу отредактировать это, чтобы удалить пустые строки? – Monz

+0

в заявлении на печать просто измените переменную i для i [: - 1] так же, как и в x. – KarTo

3

Я не уверен, что вы хотите, но я предполагаю, что это он:

lines = [] 
buffer = [] 
for line in f: 
    if 'date with' in line: 
     lines.extend(["%s|%s" % (x, line) for x in buffer])    
     buffer = [] 
    else: 
     buffer.append(line) 

# print lines 
for line in lines: 
    print line 

# or save in a file 
with open('myfile', 'w'): 
    for line in lines: 
     f.write(line) 
+0

Как печатать выходные линии – Monz

+0

= [] буфер = [] с открытой ('C: /Users/dit3442/Desktop/smallfruit.txt'), как INFP: для линии в INFP: если «дата с 'in line: lines.extend (["% s |% s"% (x, line) для x в буфере]) buffer = [] else: buffer.append (строка) – Monz

+0

Я обновил свой ответ, проверить его;) –

0

Вот itertools подход:

from itertools import groupby, izip, product 

with open('input') as fin, open('output', 'w') as fout: 
    grouped = groupby(fin, lambda L: not L.startswith('date')) 
    lines = ([el.strip() for el in g] for k, g in grouped) 
    paired = izip(*[lines]*2) 
    for pair in paired: 
     fout.writelines('|'.join(items) + '\n' for items in product(*pair)) 
0

Я получил два решения для вас,

чтения файла с конца и собирать предметы, как он протекает с простой логикой:

with open("file.txt") as f: 
    lines = f.readlines() 
output=[] 
for line in reversed(lines): 
     if line.startswith("date with"): msg = line 
     else: output.append("{0}|{1}".format(line[:-1], msg)) 
for line in reversed(output): print line 

и традиционным способом, из верхней части файла построчно:

granary = [] 
basket = [] 
with open("file.txt") as f: 
    for line in f: 
     basket.append(line) 
     if line.startswith("date with"): 
      granary += map(lambda x: "{0}|{1}".format(x[:-1], line), basket[:-1]) 
      del basket[:] 
for item in granary: print item 
Смежные вопросы