2016-06-24 6 views
0

У меня есть текстовый файл, как это:Как написать разделы файла в отдельные списки в python 3.0?

line 1 
line 2 
. 
. 
END OF SECTION 1, BEGIN SECTION 2 
line 100 
line 101 
. 
. 
END OF SECTION 2, BEGIN SECTION 3 
line 999 
line 1000 
. 
. 
END OF SECTION 3, BEGIN SECTION 4 
END OF SECTION 4, BEGIN SECTION 5 
line 5000 
line 5001 
. 
. 
END OF SECTION 5 
Q 

Таким образом, этот файл имеет 5 секций с переменной # записей/строк данных в секции (секции не все имеют одинаковые # линий, в некоторых разделах даже нет данных).

Моя задача - прочитать этот файл и разделить каждый раздел на список (так что в моем примере я приведу 5 отдельных списков), которые затем будут выписаны в книгу Excel, состоящую из листов, содержащих списки. Таким образом, я хочу, чтобы в конечном итоге с 5 списков, которые я называю:

section_01_log
section_02_log
section_03_log
section_04_log
section_05_log

, а затем, мой книги Excel будет иметь эти 5 вкладок/листов в Это.


На данный момент, я борюсь с первой части (то есть, создавая списки), и хотел бы получить некоторую помощь. Как только я получу это, я буду работать над второй частью, которая записывает списки в книгу Excel.

вот мой код

#read the file into a list named "input_file" already defined 
datafile = open(os.path.join(path,'filename')) 
for line in datafile: 
    input_file.append(line) 
datafile.close() 

# parse the "input_file" list and write only section 1 
for line in input_file: 
    if line.startswith('END OF SECTION 1'): 
     exit 
    else: 
     section_01_log.append(line) 

К сожалению, это не работает. section_01_log продолжает писать все содержимое input_file. Зачем? Как просто отделить первый раздел в section_01_log, а затем сделать то же самое для всех остальных разделов?

ответ

0

Так у вас есть список ваше право с помощью этой команды:

myList = [] 
with open("test.txt", 'r') as fileopen: 
    myList = [line.strip() for line in fileopen] 
print (myList) 

Выход:

['line 1', 'line 2', 'END OF SECTION 1, BEGIN SECTION 2', 'line 100', 'line 101', 'END OF SECTION 2, BEGIN SECTION 3', 'line 999', 'line 1000', 'END OF SECTION 3, BEGIN SECTION 4', 'END OF SECTION 4, BEGIN SECTION 5', 'line 5000', 'line 5001', 'END OF SECTION 5'] 

Если вы хотите хотите писать в файл Excel, я предлагаю, чтобы сделать этот шаг за шагом:

  1. изолировать каждую секцию в различных списках
  2. создать экс чел файл
  3. написать свой список в Excel файл

1.An легкий способ разделения списков (это не очень чистый, и не должны быть воспроизведены, если у вас слишком много списков):

section1 = myList[0:myList.index("END OF SECTION 1, BEGIN SECTION 2")] 
section2 = myList[myList.index("END OF SECTION 1, BEGIN SECTION 2")+1 : myList.index("END OF SECTION 2, BEGIN SECTION 3")] 
section3 = myList[myList.index("END OF SECTION 2, BEGIN SECTION 3")+1 : myList.index("END OF SECTION 3, BEGIN SECTION 4")] 
section4 = myList[myList.index("END OF SECTION 3, BEGIN SECTION 4")+1 : myList.index("END OF SECTION 4, BEGIN SECTION 5")] 
section5 = myList[myList.index("END OF SECTION 4, BEGIN SECTION 5")+1 : myList.index("END OF SECTION 5")] 

В основном вы просто используете индексы для разбивки списка. Легко ли?

2.Создайте файл Excel и создайте листы youor. Вам необходимо импортировать xlwt:

import xlwt 

xl = xlwt.Workbook(encoding="utf-8") 

section_01 = xl.add_sheet("section_01_log") 
section_02 = xl.add_sheet("section_02_log") 
section_03 = xl.add_sheet("section_03_log") 
section_04 = xl.add_sheet("section_04_log") 
section_05 = xl.add_sheet("section_05_log") 

3.Вы пишете в файл Excel и сохранять :)

for i, r in enumerate(section1): 
    section_01_log.write(i, 0, r) 
for i, r in enumerate(section2): 
    section_02_log.write(i, 0, r) 
for i, r in enumerate(section3): 
    section_03_log.write(i, 0, r) 
for i, r in enumerate(section4): 
    section_04_log.write(i, 0, r) 
for i, r in enumerate(section5): 
    section_05_log.write(i, 0, r) 

xl.save("logs.xls") 

Как я уже говорил ранее, есть более чистые способы сделать это с, но я новичок ...

0

Причина код ISN» t работает потому, что exit не делает то, что, по вашему мнению, делает, предполагая, что вы хотите, чтобы он вышел из цикла for, и в этом случае вам нужен оператор break. exit - это встроенная константа, которая при вызове - так: exit() - вызывает SystemExit и предназначена для удобного выхода из интерактивного интерпретатора. Поскольку вы не называли это, он просто оценивает строку, и ваш цикл for-loop продолжается.

https://docs.python.org/2/library/constants.html#exit

следующий подход должен работать, и он работает для файла, который имеет более или менее 5 секций, до тех пор, как он структурирован подобно тому, что вы дали в качестве примера, и он использует довольно простой, императивный питон. Я предполагаю, что «Q» используются как Sentinal значения для сигнала конца

with open('testing.txt') as f: 
    log = {1:[]} 
    i = 1 
    new_section = False # flag to prevent creating sections just for sentinel 
    for line in f: 
     line = line.strip() 

     if line == 'Q': # if we have reached the end of the file 
      break 
     elif new_section: 
      i += 1 
      log[i] = [] 
      new_section = False 

     if line.startswith('END OF SECTION'): 
      new_section = True 
     else: 
      log[i].append(line) 

log теперь словарь как это:

{1: ['line 1', 'line 2', 'line 3', 'line4'], 
2: ['line 100', 'line 101', 'line 102', 'line 103'], 
3: ['line 999', 'line 1000', 'line 1001', 'line 1003'], 
4: [], 
5: ['line 5000', 'line 5001', 'line 5002', 'line 5003']} 

который был сделан из этого примера текстового файла:

line 1 
line 2 
line 3 
line4 
END OF SECTION 1, BEGIN SECTION 2 
line 100 
line 101 
line 102 
line 103 
END OF SECTION 2, BEGIN SECTION 3 
line 999 
line 1000 
line 1001 
line 1003 
END OF SECTION 3, BEGIN SECTION 4 
END OF SECTION 4, BEGIN SECTION 5 
line 5000 
line 5001 
line 5002 
line 5003 
END OF SECTION 5 
Q 
Смежные вопросы