比较名称列表和Excel文件中的列

时间:2019-12-05 09:47:15

标签: python excel openpyxl

我有一个txt文件(file1),其中包含蛋白质名称列表,以及一个excel文件,其中第二列包含较大的蛋白质名称列表。我想浏览这两个列表,并确定xlsx文件中是否显示了file1中的蛋白质。因此,如果xlsx中有一行对应于file1中的蛋白质,那么我不希望该行着色。这是我编写的一些代码。

for line in file1:
    for i in range(2,worksheet.max_row):
        if line.split('|')[1] == worksheet.cell(row=i, column=2).value:
            worksheet.cell(row=i, column=2).fill = PatternFill(fill_type='solid', start_color='ff8327', end_color='ff8327')

但是代码无法正常工作。它使第一个蛋白质名称产生一个循环,然后停止而不进行进一步的编码。 还有一个问题,我想使过程更快。

如果有人知道解决问题的任何方法,请分享。

最好

玛丽亚

3 个答案:

答案 0 :(得分:0)

如果两列都为列表,则可以使用列表推导,甚至可以使用set操作来获取文本文件和excel文件中的蛋白质列表:

file1 = ["ABCD1", "PTEN", "MMP13"]

excel = ["ABCD1", "AKT3", "PTEN", "SOCS3", "SIRT1"]

# List comprehension
intersect = [protein for protein in file1 if protein in excel]
print(intersect)

['ABCD1', 'PTEN']

# Set operation

intersect_set = list(set(file1)&set(excel))
print(intersect_set)

['ABCD1', 'PTEN']

基于此获得的列表,您也许可以在excel中为蛋白质着色。

for i in range(2,worksheet.max_row):
    protein = worksheet.cell(row=i, column=2).value
    if protein in intersect:
            worksheet.cell(row=i, column=2).fill = PatternFill(fill_type='solid', start_color='ff8327', end_color='ff8327')

答案 1 :(得分:0)

通过将txt文件中的数据存储到数组中,如下所示,可以避免一个for循环

file1 = open('test2.txt', 'r')
lines = [line.rstrip('\n').split('|')[1] for line in file1]
file1.close()
for i in range(2,worksheet.max_row):
    if worksheet.cell(row=i, column=2).value in lines:
        worksheet.cell(row=i, column=2).fill = PatternFill(fill_type='solid', start_color='ff8327', end_color='ff8327')

答案 2 :(得分:0)

您应该使用文本文件中的一组蛋白质名称进行比较。您的代码不完整,因此您可能需要对此进行一些更改才能使其正常工作。

假设文本文件中包含这样的行“ SOMETHING | PROTEIN”

with open('proteins.txt', 'r') as src:
    proteins = {line.split("|")[1] for line in src.readlines()}

#Define the fill
fill = PatternFill(fill_type='solid', start_color='ff8327', end_color='ff8327')

#check the cells in column B and assign the fill
for cell in ws['B']:
    if cell.value in proteins:
        cell.fill = fill