2015-02-20 2 views
0

У меня есть файл, который имеет имя файла новой строки, а затем hashvalue файла, а затем новую строку. Эта картина повторяется. Пример:Вручную читать строки в python

blah.txt 
23847EABF8742 
file2.txt 
1982834E387FA 

У меня есть класс, называемый «информацией», который имеет две переменные-члены.

class information: 
    filename='' 
    hashvalue='' 

Теперь я хочу прочитать в файл и сохранить имя файла и значение хэша в новом экземпляре «информации» объекта, а затем нажмите на экземпляр информационного объекта на список.

Проблема, с которой я столкнулась, это перебор по файлу, чтобы прочитать его. Я хочу прочитать его по очереди до конца файла. Проблема с методом python 'for line in file' заключается в том, что он каждый раз берет строку, и я буду вынужден делать какую-то другую тактику, чтобы поместить данные в правильную переменную-член.

Вместо этого то, что я пытаюсь сделать ...

list=[] 
while(not end of file) 
    x = information() 
    x.filename = file.readline() 
    x.hashvalue = file.readline() 
    list.append(x) 

ответ

2

Вы могли бы написать функцию генератора:

def twolines(file): 
    cur = None 
    for i in file: 
     if cur is None: 
      cur = i 
     else: 
      yield (cur, i) 
      cur = None 

Затем передать свой файловый объект twolines(), и сделать что-то вроде

for i, j in twolines(file): 
    x = information() 
    x.filename, x.hashvalue = i,j 
    list.append(x) 
+1

'two_lines = лямбда файла: застежка-молния (* [файл] * 2)', но отличное решение ... –

1
while True: 
    x = information() 
    x.filename = file.readline() 
    if not x.filename: 
     break 
    x.hashvalue = file.readline() 
    my_list.append(x) 

может быть?

или

while True: 
    x = information() 
    try: 
     x.filename = next(file) 
     x.hashvalue = next(file) 
    except StopIterationError: 
     break 
    my_list.append(x) 

или мой любимый

my_list = [filename,hashvalue for filename,hashvalue in zip(file,file)] 
0

Как об этом:

list = [information(filename=x.rstrip(), hashvalue=next(it).rstrip()) for x in file] 
+0

файл уже ИТЭР ... вы можете просто сделать 'для x в файле' .. и использовать 'next (file)' вместо next (x) –

+0

'it = iter (file.readlines())' точно совпадает с 'it = file' –

+0

Правильно .. обновлено. –

0

Другого простое исправление путем подсчета строк. Для этого введите переменную типа line = 0. Теперь вы можете попробовать следующее:

for lines in file: 
    line = line + 1 
    if line % 2 == 1: 
     # This will be the filename 
    else: 
     # This will be the hashcode 
+0

Im очень уверен, что он явно заявил, что он не хотел этого делать ... также 'for i, строка в перечислении (файл): if i % 2', вероятно, будет незначительным улучшением –