Как определить файлы с дублирующими заголовками при добавлении более 300 электронных таблиц Excel? - PullRequest
0 голосов
/ 30 апреля 2019

Я пытаюсь добавить 300+ файлов xlsx в один, но получаю следующую ошибку:

AttributeError: 'NoneType' object has no attribute 'is_extension'

Снимок экрана ошибки:

enter image description here

После некоторого поиска в Google я обнаружил, что у кого-то была такая же ошибка, вызванная дублирующимися заголовками. Это определенно возможно с этими файлами, так как они созданы людьми, которые не являются программистами, и я заметил, что это происходило раньше. Но как мне найти, какие файлы исправить? С помощью имени файла я могу сообщить им, какие из них изменить, если у меня нет простого способа обойти это с помощью кода. Просмотр каждого файла вручную не был бы идеальным.

Вот мой код:

import pandas as pd
import glob
import os

globbed_files = glob.glob("BestColleges.com _ 2019 Online Rankings/BC*.xlsx") 

data = [] # pd.concat takes a list of dataframes as an argument

for file in globbed_files: # some files have headers on first row, others second row
    df = pd.read_excel(file, sheet_name='4. Final Ranked List')
    if df.columns[0] == 'IPEDS': # if true, first cell contains headers
        df['filename'] = os.path.basename(file)
        df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')', '') # normalize headers
        data.append(df)
    else:
        df = pd.read_excel(file, sheet_name='4. Final Ranked List', skiprows=1) # skip first row if not headers
        df['filename'] = os.path.basename(file)
        df.columns = df.columns.str.strip().str.lower().str.replace(' ', '_').str.replace('(', '').str.replace(')', '')
        data.append(df)

bigframe = pd.concat(data, ignore_index=True, sort=False) # concatenate the data frames into one
bigframe.to_excel("bc_non_doc.xlsx", index=False)

Так что список имен файлов с дублирующимися заголовками был бы неплох, или посмотреть, какой файл выдает ошибку, или, возможно, AttributeError не имеет ничего общего с дублирующимися заголовками?

1 Ответ

0 голосов
/ 01 мая 2019

Требуется ли это делать с помощью Python?

Я бы предложил решение с использованием Com Objects в Powershell:

$yourDirectory = "BestColleges.com _ 2019 Online Rankings/BC*.xlsx"

$Excel = New-Object -ComObject Excel.Application

$GlobalHeaders = @()

foreach ($file in (gci $yourDirectory).FullName) {

$Workbook = $Excel.Workbooks.Open($file)
$Worksheet = $Workbook.ActiveSheet
$colMax = ($Worksheet.UsedRange.Columns).Count

#Test if A1 = 'IPEDS' to determine headers row number
if ($Worksheet.Cells(1,1).Text = 'IPEDS') 
    {$row = 1} 
    else {$row = 2}

$firstRow = @()
for ($i = 1; $i -le $colMax; $i++){
    $firstRow += $Worksheet.Cells($row,$i).Text}

$Headers = New-Object PSObject  
$Headers | Add-Member -Type NoteProperty -Name FileName -Value $file
$Headers | Add-Member -Type NoteProperty -Name Headers -Value $firstRow
$GlobalHeaders += $Headers

$Workbook.close($false)

}

$Excel.Quit()

#You eventually get a list in $GlobalHeaders of all the headers and file names 
#and filter to keep only the unique occurences of headers list
$GlobalHeaders | Sort-Object -Unique Headers

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

...