#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, столбец = число)