我有一个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')
但是代码无法正常工作。它使第一个蛋白质名称产生一个循环,然后停止而不进行进一步的编码。 还有一个问题,我想使过程更快。
如果有人知道解决问题的任何方法,请分享。
最好
玛丽亚
答案 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