Объединить записи в многострочном файле на основе критериев - PullRequest
1 голос
/ 13 июля 2009

Я пытаюсь написать скрипт на Python

, который принимает такие данные записи

6xxxxxxxx
7xxxxxxxx
6xxxxxxxx
7xxxxxxxx
7xxxxxxxx
6xxxxxxxx
6xxxxxxxx
6xxxxxxxx
7xxxxxxxx
7xxxxxxxx
7xxxxxxxx

и выполняет следующую логику

newline = ""
read in a record
    if the record starts with a 6 and newline = ''
        newline = record
    if the records starts with a 7
        newline = newline + record
    if the record starts with a 6 and newline != ''
        print newline
        newline = record

Так что это должно распечатать так:

6xxxxxx 7xxxxxxxx
6xxxxxx 7xxxxxxxx 7xxxxxxx 7xxxxxxx
6xxxxxx
6xxxxxx
etc..

Вот мой код:

han1 = open("file","r")

newline = ""
for i in han1:
        if i[0] == "6" and newline == "":
                newline = i
        elif i[0] == "7":
                newline = newline + i
        elif i[0] == "6" and newline != "":
                print newline
                newline = ""
                newline = i


han1.close()

Когда я запускаю свой скрипт, вывод выглядит нетронутым. Как вы думаете, где я иду не так. Это потому, что переменная newline не будет хранить значения между итерациями цикла? Любое руководство будет оценено.

Ответы [ 3 ]

0 голосов
/ 13 июля 2009

Вы можете упростить это, просто добавив новую строку для записи, которая начинается с 6, и не добавляя ее, если это не так.

for line in open('infile'):
  if line[0] == '6':
    print ''
  print line.strip() ,

ОК, сначала в файле создается одна пустая строка, и файл может не заканчиваться символом новой строки. Тем не менее, это легко исправить.

Или решение, которое не имеет такой проблемы и ближе к вашему:

newline = ''
for line in open('infile'):
    if line[0] == '6':
        if newline:
            print newline
            newline = ''
    newline += ' ' + line.strip()
if newline:
     print newline

Также работает, но немного дольше.

Тем не менее, я думаю, что ваша главная проблема в том, что вы не удаляете записи, поэтому сохраняете перевод строки.

0 голосов
/ 14 июля 2009

если ваш файл не в ГБ,

data=open("file").read().split()
a = [n for n,l in enumerate(data) if l.startswith("6") ]        
for i,j in enumerate(a):
    if i+1 == len(a):
        r=data[a[i]:]
    else:
        r=data[a[i]:a[i+1]]
    print ' '.join(r)
0 голосов
/ 13 июля 2009

Ни одна из ветвей в вашем операторе if не заканчивается с newline, установленным в "". Поэтому первая ветвь никогда не будет оцениваться, потому что newline никогда не "", за исключением самого первого случая.

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