Сценарий 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".

надеюсь, это поможет

Другие вопросы по тегам