Как проверить для каждого столбца, если строка пуста?

#python #excel #openpyxl

#python #excel #openpyxl

Вопрос:

Я создал простую программу, которая извлекает данные из файла .txt. Небольшая часть файла .txt:

скриншот

4-значное число между (и ) и шестнадцатеричное между < и > — это данные, на которые я ссылаюсь. После того, как я его нарезал, я хочу записать данные в файл Excel.

Я написал (уродливый) код, который запомнит номер строки и запишет данные в ячейку ниже для каждого столбца (всего 9 столбцов)

Есть ли лучший способ получить тот же результат? Я хотел бы улучшить.

 import openpyxl

infile = open('test.txt')

s = infile.readlines()

wb = openpyxl.load_workbook(filename='Main.xlsx')
ws = wb.active
VariableRow1 = 2
VariableRow2 = 2
VariableRow3 = 2
VariableRow4 = 2
VariableRow5 = 2
VariableRow6 = 2
VariableRow7 = 2
VariableRow8 = 2
VariableRow9 = 2
for i in range(len(s)):
    if '<' in s[i] and '(' in s[i]:

        PijlOpen = s[i].find('<')
        PijlDicht = s[i].find('>')
        HaakjeOpen = s[i].find('(')
        HaakjeDicht = s[i].find(')')
        Number = (s[i])[HaakjeOpen   1:HaakjeDicht]
        Number = Number.replace('0', '')

        Value = (s[i])[PijlOpen   1:PijlDicht]

        Value = Value.replace(' ', '')
        Value = bytes.fromhex(Value).decode('utf-8')
        Number = int(Number)
        
        if Number == 1:
            if ws.cell(row=VariableRow1, column=Number).value != None:
                VariableRow1  = 1
            cell = ws.cell(row=VariableRow1, column=Number)
            cell.value = Value
        if Number == 2:
            if ws.cell(row=VariableRow2, column=Number).value != None:
                VariableRow2  = 1
            cell = ws.cell(row=VariableRow2, column=Number)
            cell.value = Value
        if Number == 3:
            if ws.cell(row=VariableRow3, column=Number).value != None:
                VariableRow3  = 1
            cell = ws.cell(row=VariableRow3, column=Number)
            cell.value = Value
            
        if Number == 4:
            if ws.cell(row=VariableRow4, column=Number).value != None:
                VariableRow4  = 1
            cell = ws.cell(row=VariableRow4, column=Number)
            cell.value = Value
        if Number == 5:
            if ws.cell(row=VariableRow5, column=Number).value != None:
                VariableRow5  = 1
            cell = ws.cell(row=VariableRow5, column=Number)
            cell.value = Value
        if Number == 6:
            if ws.cell(row=VariableRow6, column=Number).value != None:
                VariableRow6  = 1
            cell = ws.cell(row=VariableRow6, column=Number)
            cell.value = Value
            
        if Number == 7:
            if ws.cell(row=VariableRow7, column=Number).value != None:
                VariableRow7  = 1
            cell = ws.cell(row=VariableRow7, column=Number)
            cell.value = Value
        if Number == 8:
            if ws.cell(row=VariableRow8, column=Number).value != None:
                VariableRow8  = 1
            cell = ws.cell(row=VariableRow8, column=Number)
            cell.value = Value
        if Number == 9:
            if ws.cell(row=VariableRow9, column=Number).value != None:
                VariableRow9  = 1
            cell = ws.cell(row=VariableRow9, column=Number)
            cell.value = Value

        wb.save(filename='Main.xlsx')
print ('Finished')
  

Комментарии:

1. В общем, если вы используете более 3-4 операторов if в цикле, часто бывает хорошей идеей переключиться на использование списка для определения операторов if в цикле.

2. Не могли бы вы объяснить, что вы имеете в виду? Как я мог бы использовать список для определения операторов if?

3. Приведенный ниже ответ @Mike67 сделал именно это. Идея в том, что если у вас есть список переменных, вы можете использовать индекс этого списка для хранения этих данных. Мы знаем, какой индекс списка нам нужен, поэтому теперь не нужно проверять, является ли он правильным для всех переменных с помощью операторов if!

4. Ого, это супер умно! Большое вам обоим спасибо, теперь я это понимаю: D

5. В общем, использование регулярного выражения для обработки файлов журнала — это правильный путь. Как только вы разработаете регулярное выражение, а это может занять некоторое время!, остальная часть кода может быть намного проще.

Ответ №1:

Ваш код можно сократить, используя список вместо 9 переменных:

Попробуйте этот код:

 import openpyxl

infile = open('test.txt')

s = infile.readlines()

wb = openpyxl.load_workbook(filename='Main.xlsx')
ws = wb.active
VariableRow = [2]*9  # index 0-8

for i in range(len(s)):
    if '<' in s[i] and '(' in s[i]:

        PijlOpen = s[i].find('<')
        PijlDicht = s[i].find('>')
        HaakjeOpen = s[i].find('(')
        HaakjeDicht = s[i].find(')')
        Number = (s[i])[HaakjeOpen   1:HaakjeDicht]
        Number = Number.replace('0', '')

        Value = (s[i])[PijlOpen   1:PijlDicht]

        Value = Value.replace(' ', '')
        Value = bytes.fromhex(Value).decode('utf-8')
        Number = int(Number)
        
        if number in range(1,10):  # 1-9
            if ws.cell(row=VariableRow[number-1], column=Number).value != None:
                VariableRow[number-1]  = 1
            cell = ws.cell(row=VariableRow[number-1], column=Number)
            cell.value = Value
        
        wb.save(filename='Main.xlsx')
print ('Finished')
  

Комментарии:

1. Переменная ROW1 неверна или я что-то упускаю? ячейка = ws.cell(строка = VariableRow1, столбец = число)