Ошибка сортировки в Excel после замораживания первой строки с помощью openpyxl в Python - PullRequest
0 голосов
/ 06 ноября 2019

Я изучаю английские коренные слова из Википедии. Так как некоторые из примеров слов, перечисленных в Википедии, слишком сложны, я написал скрипт на Python, чтобы отфильтровать их по списку слов, который включает только более простые слова. Я также заблокировал строку заголовка результирующей электронной таблицы с помощью openpyxl. Затем я открыл электронную таблицу в Excel и отсортировал третий столбец вручную .

Проблема в том, что строка заголовка также включается в сортировку (пожалуйста, проверьте фотографии). Я думаю, что это может иметь какое-то отношение к тому факту, что скрипт коснулся только третьего столбца (он же пример столбца слов) и сохранил его как новую копию таблицы. Первый и второй столбцы не были затронуты. Есть ли способ решить это? Заранее спасибо.

Код (плз с акцентом на закомментированную часть):

# rootWordFinder.py - 1. Filter Wikipedia examples for a root word; 2. Find root words in a word
import re, openpyxl, os

# get word lists (CET4&6)
def removeDup(dupList):
    tempList = []
    for i in range(len(dupList)):
        if dupList[i] not in tempList:
            tempList += [dupList[i]]
    return tempList

cet4File = open('C:\\Users\\zs\\Documents\\PythonScripts\\大学英语四级大纲单词表(贵州大学).txt')
cet4Content = cet4File.read()
cet4File.close()
cet4Regex = re.compile(r'\b([a-zA-Z-]+)(?:(?:\s?\[)|(?:\s[a-z]))')
cet4ListRough = cet4Regex.findall(cet4Content)  # list of strings, not list of tuples. If there's only one item in a tuple, the parentheses around it will be automaticlly removed.
cet4List = []
for i in cet4ListRough:
    cet4List += [i.lower()]

cet6File = open('C:\\Users\\zs\\Documents\\PythonScripts\\cet6_words(中国教育在线).txt')
cet6Content = cet6File.read()
cet6File.close()
cet6Regex = re.compile(r'\s([a-zA-Z-]{2,})\s')
cet6ListRough = cet6Regex.findall(cet6Content)
cet6List = []
for i in cet6ListRough:
    cet6List += [i.lower()]

wordList = removeDup(cet4List + cet6List)

# get dictionary of root words
rootDict = {}
wb = openpyxl.load_workbook('root words - raw.xlsx')
sheet = wb.active
for rowNum in range(2, sheet.max_row + 1):
    rootDict[sheet.cell(row=rowNum, column=1).value] = sheet.cell(row=rowNum, column=2).value

# write to xls - root word to word (filter examples from Wikipedia)
##for rowNum in range(2, sheet.max_row + 1):
##    examples = sheet.cell(row=rowNum, column=3).value
##    exampleWords = examples.split(', ')
##    exampleList = []
##    for word in exampleWords:
##        if word.lower() in wordList:
##            exampleList += [word]
##    sheet.cell(row=rowNum, column=3).value = ', '.join(exampleList)
##sheet.freeze_panes = 'A2'   # freeze the header row - Row 1

# write to xls - word to root word
wb.create_sheet(index=1, title='CET4 Words')
wb.create_sheet(index=2, title='CET6 Words')

def populateSheet(sheetName, vocabList):
    sheet = wb.get_sheet_by_name(sheetName)
    sheet['A1'].value = 'WORDS'
    sheet['B1'].value = 'POSSIBILE ROOTS'
    sheet.freeze_panes = 'A2'   # freeze the header row - Row 1
    rowNum = 2
    for word in vocabList:
        sheet.cell(row=rowNum, column=1).value = word
        exampleContent = ''
        existingKeys = []
        for key in rootDict.keys():
            for root in key.split(', '):
                if root.strip('-') in word and root.strip('-') not in ['a', 'e', 'i', 'o', 'u'] and key not in existingKeys:
                    exampleContent += (key + ' ===> ' + rootDict[key] + '\n')
                    existingKeys += [key]
        exampleContent = exampleContent.rstrip('\n')
        sheet.cell(row=rowNum, column=2).value = exampleContent
        rowNum += 1

populateSheet('CET4 Words', cet4List)
populateSheet('CET6 Words', cet6List)

wb.save('roots and words.xlsx')
print('"roots and words.xlsx" generated.\nDon\'t forget to enable "自动换行".\nOpen it now? <y/n>')
if input() != 'n':
    os.startfile('C:\\Users\\zs\\Documents\\PythonScripts\\roots and words.xlsx')   # https://stackoverflow.com/questions/21191494/how-to-open-an-excel-file-with-python-to-display-its-content
print('Done.')

Изображения:

Исходная электронная таблица с необработанным контентом из Википедии:

The source spreadsheet with raw content from Wikipedia Электронная таблица после программной фильтрации:

The spreadsheet after the programmatic filtering Электронная таблица после ручной сортировки в Excel:

The spreadsheet after manual sorting in Excel

...