Записать файл Xlsx с помощью Python - Пустые строки в файле Excel - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь написать скрипт Python для разбора текстового файла в листе Excel.

В этом скрипте я пытаюсь написать список списков в файле Xlsx, где каждый элемент списказаписывается в одной строке листа.

Проблема в том, что когда у меня есть два равных элемента, и они появляются последовательно, и при использовании обоих модулей python для создания файла excel (xlsxwriter и openpyxl) они просто пишут один изравно элементам, и вместо второго элемента они пишут пустую строку.

Пример :

Список ввода:

list = [['dog', 'cat', 'bat', 'jaguar'], ['dog', 'cat', 'bat', 'jaguar']]

ExcelФайл записан так:

      A      B       C      D
   1 dog    cat     bat    jaguar
   2 blank line

Кто-нибудь знает, если я что-то не так делаю?

Это мой код:

def criaExcel(filename, regras):

    nomeDoArquivo = filename.rstrip('.wri')+'.xlsx'

    workbook = xlsxwriter.Workbook(nomeDoArquivo)

    planilha = workbook.add_worksheet('Rules')

    indice = ''

    for regra in regras:

        indice = str(regras.index(regra)+1)

        planilha.write('A'+ indice, regra[0])
        planilha.write('B'+ indice, regra[1])
        planilha.write('C'+ indice, regra[2])
        planilha.write('D'+ indice, regra[3])
        planilha.write('E'+ indice, regra[4])
        planilha.write('F'+ indice, regra[5])
        planilha.write('G'+ indice, regra[6])


    workbook.close()




def parseV3(filename):

    manipulador = open(filename, 'r', encoding="Latin-1")

    regras  = []
    regras.append(['Zona', 'Origem', 'Destino', 'Serviço', 'Ação', 'Status', 'Comentário'])

    zona = origem = destino = servico = acao = status = comentario = ''

    padraoCabecalho = re.compile('^Rule.+ (Allow|Deny) Service Any -> (.*) (\(Enabled\)|\(Disabled\))')

    padraoInformacoes = re.compile('^\s{7,8}IP: (.*) -> (.*)  .*')

    padroaComentario = re.compile('^Comment:                   (.*)')


    for linha in manipulador:


        if linha.startswith('From '):

           zonaTemp = linha.rstrip().lstrip('From ')

           if zona == '':
               zona = zonaTemp

           elif zona != zonaTemp:
              zona = zonaTemp


        elif padraoCabecalho.match(linha):

            objetos = padraoCabecalho.match(linha)

            acao, servico, status = objetos.groups()


        elif padraoInformacoes.match(linha):

             objetos = padraoInformacoes.match(linha)

             origem, destino = objetos.groups()


        elif padroaComentario.match(linha):

              objeto = padroaComentario.match(linha)

              comentario = objeto.group(1)

              regras.append([zona, origem, destino, servico, acao, status, comentario])


        elif linha.rstrip() == '#Firewall : Access Rules_END':
            break

    manipulador.close()

    criaExcel(filename, regras)

1 Ответ

0 голосов
/ 27 сентября 2018

В примере кода есть несколько проблем.

Во-первых, index(), вероятно, не делает то, о чем вы думаете.Лучшим подходом было бы использовать enumerate().

. Кроме того, вам не нужно использовать (или создавать) строки стиля A1 для write().Он также принимает обозначения row, col, что было бы лучше в этом случае.

Например:

import xlsxwriter


def criaExcel(filename, regras):

    nomeDoArquivo = filename.rstrip('.wri')+'.xlsx'

    workbook = xlsxwriter.Workbook(nomeDoArquivo)

    planilha = workbook.add_worksheet('Rules')

    for row_num, regra in enumerate(regras):

        planilha.write(row_num, 0, regra[0])
        planilha.write(row_num, 1, regra[1])
        planilha.write(row_num, 2, regra[2])
        planilha.write(row_num, 3, regra[3])
        planilha.write(row_num, 4, regra[4])
        planilha.write(row_num, 5, regra[5])
        planilha.write(row_num, 6, regra[6])

    workbook.close()


regras = [['dog', 'cat', 'bat', 'jaguar', 'cat', 'eel', 'cow'],
          ['dog', 'cat', 'bat', 'jaguar', 'cat', 'eel', 'cow']]


criaExcel('test.wri', regras)

Вывод:

enter image description here

...