Сценарий Python, который проверяет один и тот же лист в 300 xlsx файлах, сравнивает его с основным листом и соответственно обновляет его
У меня есть список около 300 файлов Excel, все названы в соответствии с этим шаблоном [aA-zZ]{1}[0-9]{5}.xlsx
и мастер-файл. Я пытаюсь собрать скрипт Python, который читает один и тот же лист / столбец в каждом файле, сравнивает его с листом мастера и обновляет его соответствующим образом.
Я пробовал openpyxl, но я безнадежно застрял, любая помощь очень ценится.
#!Python3
import openpyxl
import pandas as pd
import os
# Move to the correct location
path = "/usr/tmp/files"
os.chdir(path)
# First we open the master file
wb = load_workbook('master.xlsx')
# grab master worksheet in master.xlsx
ws = wb.active('Sheet1')
#Second we open the rest of the files that include changes and compare with the data in master.xlsx
def main():
for f in files:
wb2 = load_workbook(f)
ws2 = wb2['Sheet1']
#read first workbook to get data
wb2 = load_workbook(filename = '.xlsx')
ws2 = wb2.get_sheet_by_name(name = 'Sheet1')
#Iterate through worksheet and compare with master sheet for changes
for row in ws.iter_rows():
for cell in row:
cellContent = str(cell.value)
if cellContent == 'yes'
wb = load_workbook('master.xlsx', optimized_write=True)
# Update cell contents
ws[cell] = cellContent
# Save workbook
wb.save('master.xlsx')
if __name__ == '__main__':
main()
Спасибо!!
!!!!! отредактированный код!!!!!
#!Python3
From openpyxl import *
import pandas as pd
import os
import re
# Move to the correct location
path = "/usr/tmp/files"
os.chdir(path)
# First we open the master file
wb = load_workbook('master.xlsx')
# grab master worksheet in master.xlsx
ws = wb.get_sheet_by_name('Sheet1')
# Open the rest of the files that include changes and compare with the data in master.xlsx
def main():
files = [f for f in os.listdir('.') if re.match(r'[A-Za-z][0-9]{5}\.xlsx', f)]
#read each workbook to get data
for f in files:
wb2 = load_workbook(f)
ws2 = wb2.get_sheet_by_name('Sheet1')
#Iterate through worksheet and compare with master sheet for changes
for row in ws2.iter_rows():
for cell in row:
cellContent = str(cell.value)
if cellContent == "yes":
wb = Workbook(write_only = True)
# Update cell content
ws[cell.coordinate] = str(cellContent)
else:
continue
# Save workbook
wb.save('master.xlsx')
if __name__ == '__main__':
main()
2 ответа
В зависимости от размера файлов у меня возникнет соблазн сделать это в два этапа: сначала прочитать файлы в режиме только для чтения и определить, нужно ли их исправлять или нет.
Затем просмотрите список файлов, которые нужно исправить, и обновите только эти. Это, вероятно, самый быстрый способ сделать это, потому что он останавливает загрузку всех рабочих листов всех рабочих книг в память.
NB. синтаксис, который вы используете, предназначен для более старых версий openpyxl и больше не поддерживается. Я настоятельно рекомендую вам обновить до>= 2.4 и в первую очередь обратиться к официальной документации.
Чтобы получить соответствующие файлы, сначала:
import re
затем в первой строке main()
определять files
:
files = [f for f in os.listdir('.') if re.match(r'[A-Za-z][0-9]{5}\.xlsx', f)]
Примечание. Я изменил ваш шаблон регулярных выражений в предположении, что интересующие имена файлов состоят из одной буквы (в верхнем или нижнем регистре), за которой следуют 5 цифр, за которыми следует ".xlsx".
надеюсь, это поможет