Ficheiros de texto¶
Leitura¶
O modelo mais simples é ler todo o conteúdo de um ficheiro para uma string:
A leitura de um ficheiro segundo este modelo é feito através da função
.read()
.
Mas o processo é um pouco mais complicado do que o uso simples de uma função.
O acesso (programático) a um ficheiro existente num computador requer que num programa se indique que esse acesso vai começar, a abertura de um ficheiro e que o acesso vai terminar, o fecho de um ficheiro.
.read()
, com open()
e close()
explícitos¶
a = open('eno1.fasta') seq = a.read() a.close() print(type(seq)) print('A sequência, em FASTA é') print(seq)
<class 'str'> A sequência, em FASTA é >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL GDNAVFAGENFHHGDKL
.read()
, dentro do bloco de um comando with
¶
Numa versão mais "moderna" podemos abrir e automaticamente fechar o
ficheiro é utilizar o comando with
:
with open('eno1.fasta') as a: seq = a.read() print('A sequência, em FASTA é') print(seq)
A sequência, em FASTA é >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL GDNAVFAGENFHHGDKL
O comando with
faz o ficheiro permanecer aberto até ao fim do
"bloco", (também aqui) indicado pelo alinhamento mais à direita de um ou
mais comandos a seguir à linha em que se encontra o with
. Quando
termina o bloco o ficheiro é fechado sem usar a função close()
.
Além de read()
, em que todo o conteúdo de um ficheiro é lido para uma
string, existem outras maneiras de ler um ficheiro.
.readlines()
¶
A função readlines()
lê e separa as linhas de um ficheiro para uma
lista:
with open('eno1.fasta') as a: seq = a.readlines() print(seq)
['>gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c]\n', 'MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN\n', 'DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS\n', 'KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG\n', 'DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA\n', 'DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI\n', 'GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL\n', 'GDNAVFAGENFHHGDKL\n', '\n']
O que são os \n
no fim das strings?
Numa string, \n
indica a mudança de linha. (Conta como apenas
1 caractere).
Neste caso eles aparecem porque no ficheiro original há mudanças de linha.
Muitas vezes, é necessário elimina-los. Para isso podemos usar a função
.strip()
:
with open('eno1.fasta') as a: seq = a.readlines() seq = [linha.strip() for linha in seq] print(seq)
['>gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c]', 'MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN', 'DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS', 'KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG', 'DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA', 'DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI', 'GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL', 'GDNAVFAGENFHHGDKL', '']
Ou, de uma forma sucinta, usando uma lista em compreensão:
with open('eno1.fasta') as a: seq = [linha.strip() for linha in a.readlines()] print(seq)
['>gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c]', 'MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN', 'DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS', 'KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG', 'DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA', 'DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI', 'GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL', 'GDNAVFAGENFHHGDKL', '']
Com ficheiros muito grandes, a leitura pelas funções .read()
e
.readlines()
pode esgotar a memória de um computador e "congelar" um
programa.
Existe uma terceira maneira de ler um ficheiro (que não traz problemas com ficheiros grandes):
Iteração de ficheiros com for
.¶
A iteração de um ficheiro "percorre" as linhas do ficheiro
with open('eno1.fasta') as a: for linha in a: linha = linha.strip() print('Linha:', linha)
Linha: >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] Linha: MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN Linha: DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS Linha: KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG Linha: DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA Linha: DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI Linha: GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL Linha: GDNAVFAGENFHHGDKL Linha:
Podemos até usar a função enumerate()
com um ficheiro. São gerados os
pares de valores
(num linha, linha)
.
with open('eno1.fasta') as a: for i, linha in enumerate(a): linha = linha.strip() print('linha', i, ':', linha)
linha 0 : >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] linha 1 : MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVN linha 2 : DVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKS linha 3 : KTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVG linha 4 : DEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLA linha 5 : DLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQI linha 6 : GTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL linha 7 : GDNAVFAGENFHHGDKL linha 8 :
Problema: ler uma ficheiro FASTA e separar o cabeçalho da sequência em duas strings (juntando toda a sequência numa só string)
with open('eno1.fasta') as a: linhas = [k.strip() for k in a.readlines()] header = linhas[0] # usamos um slice de uma lista de 1 até ao fim outras = linhas[1:] # e a funçao .join() com separador vazio para # juntá-las seq = ''.join(outras) print("cabeçalho:", header) print('sequência, com', len(seq), 'aminoácidos:') print(seq)
cabeçalho: >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] sequência, com 437 aminoácidos: MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVNDVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKSKTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVGDEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLADLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQIGTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEELGDNAVFAGENFHHGDKL
Às vezes os ficheiros não têm cabeçalho! É melhor testar se a primeira linha começa por ">" !
with open('eno1.fasta') as a: linhas = [k.strip() for k in a] if linhas[0].startswith('>'): header = linhas[0] seq = ''.join(linhas[1:]) else: header = "" seq = ''.join(linhas) print("cabeçalho:", header) print('sequência, com', len(seq), 'aminoácidos:') print(seq)
cabeçalho: >gi|398366315|ref|NP_011770.3| Eno1p [Saccharomyces cerevisiae S288c] sequência, com 437 aminoácidos: MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVNDVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKSKTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVGDEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLADLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQIGTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEELGDNAVFAGENFHHGDKL
As linhas em branco podem por vezes causar alguns problemas. Mas é fácil "ignora-las".
Vamos supor que o ficheiro gre3.txt tem o seguinte conteúdo:
:
>sp|P38715|GRE3_YEAST NADPH-dependent aldose reductase GRE3 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=GRE3 PE=1 SV=1 MSSLVTLNNGLKMPLVGLGCWKIDKKVCANQIYEAIKLGYRLFDGACDYGNEKEVGEGIR KAISEGLVSRKDIFVVSKLWNNFHHPDHVKLALKKTLSDMGLDYLDLYYIHFPIAFKYVP FEEKYPPGFYTGADDEKKGHITEAHVPIIDTYRALEECVDEGLIKSIGVSNFQGSLIQDL LRGCRIKPVALQIEHHPYLTQEHLVEFCKLHDIQVVAYSSFGPQSFIEMDLQLAKTTPTL FENDVIKKVSQNHPGSTTSQVLLRWATQRGIAVIPKSSKKERLLGNLEIEKKFTLTEQEL KDISALNANIRFNDPWTWLDGKFPTFA
Como separar o cabeçalho da sequência?
with open('gre3.txt') as a: linhas = [k.strip() for k in a] linhas = [k for k in linhas if len(k) > 0] if linhas[0].startswith('>'): header = linhas[0] seq = ''.join(linhas[1:]) else: header = "" seq = ''.join(linhas) print("cabeçalho:") print(header) print('sequência, com', len(seq), 'aminoácidos:') print(seq)
cabeçalho: >sp|P38715|GRE3_YEAST NADPH-dependent aldose reductase GRE3 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=GRE3 PE=1 SV=1 sequência, com 327 aminoácidos: MSSLVTLNNGLKMPLVGLGCWKIDKKVCANQIYEAIKLGYRLFDGACDYGNEKEVGEGIRKAISEGLVSRKDIFVVSKLWNNFHHPDHVKLALKKTLSDMGLDYLDLYYIHFPIAFKYVPFEEKYPPGFYTGADDEKKGHITEAHVPIIDTYRALEECVDEGLIKSIGVSNFQGSLIQDLLRGCRIKPVALQIEHHPYLTQEHLVEFCKLHDIQVVAYSSFGPQSFIEMDLQLAKTTPTLFENDVIKKVSQNHPGSTTSQVLLRWATQRGIAVIPKSSKKERLLGNLEIEKKFTLTEQELKDISALNANIRFNDPWTWLDGKFPTFA
Exemplo: Extração de informação de um ficheiro FASTA múltiplo.¶
Problema: extraír os cabeçalhos e as sequências de um ficheiro FASTA múltiplo. Mostrar o comprimento das proteínas e o número de triptofanos (W)
with open('proteins.fasta') as a: tudo = a.read() prots = tudo.split('>') for p in prots: print(len(p))
0 1121 1151 374 551 549 551 351 556
with open('proteins.fasta') as a: tudo = a.read() prots = tudo.split('>') prots = [p for p in prots if len(p) > 0] for p in prots: print(len(p)) print(p[:30])
1121 sp|P16862|PFKA2_YEAST ATP-depe 1151 sp|P16861|PFKA1_YEAST ATP-depe 374 sp|P00950|PMG1_YEAST Phosphogl 551 sp|P00924|ENO1_YEAST Enolase 1 549 sp|P30575|ENO1_CANAL Enolase 1 551 sp|P00925|ENO2_YEAST Enolase 2 351 sp|P32626|ENOPH_YEAST Enolase- 556 sp|P40370|ENO11_SCHPO Enolase
with open('proteins.fasta') as a: tudo = a.read() prots = tudo.split('>') prots = [p for p in prots if len(p) > 0] headers = [] seqs = [] for p in prots: linhas = [k.strip() for k in p.split('\n')] headers.append(linhas[0]) seqs.append(''.join(linhas[1:])) for h in headers: print(h)
sp|P16862|PFKA2_YEAST ATP-dependent 6-phosphofructokinase subunit beta OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=PFK2 PE=1 SV=4 sp|P16861|PFKA1_YEAST ATP-dependent 6-phosphofructokinase subunit alpha OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=PFK1 PE=1 SV=1 sp|P00950|PMG1_YEAST Phosphoglycerate mutase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=GPM1 PE=1 SV=3 sp|P00924|ENO1_YEAST Enolase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=ENO1 PE=1 SV=3 sp|P30575|ENO1_CANAL Enolase 1 OS=Candida albicans (strain SC5314 / ATCC MYA-2876) GN=ENO1 PE=2 SV=1 sp|P00925|ENO2_YEAST Enolase 2 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=ENO2 PE=1 SV=2 sp|P32626|ENOPH_YEAST Enolase-phosphatase E1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) GN=UTR4 PE=1 SV=2 sp|P40370|ENO11_SCHPO Enolase 1-1 OS=Schizosaccharomyces pombe (strain 972 / ATCC 24843) GN=eno101 PE=1 SV=2
with open('proteins.fasta') as a: tudo = a.read() prots = tudo.split('>') prots = [p for p in prots if len(p) > 0] headers = [] seqs = [] for p in prots: linhas = [k.strip() for k in p.split('\n')] headers.append(linhas[0]) seqs.append(''.join(linhas[1:])) ids = [] for h in headers: separados = h.split('|') ids.append(separados[1]) for i, s in zip(ids, seqs): print(i, 'tem', len(s), 'aminoácidos,', s.count('W'), 'são triptofanos')
P16862 tem 959 aminoácidos, 10 são triptofanos P16861 tem 987 aminoácidos, 12 são triptofanos P00950 tem 247 aminoácidos, 5 são triptofanos P00924 tem 437 aminoácidos, 5 são triptofanos P30575 tem 440 aminoácidos, 5 são triptofanos P00925 tem 437 aminoácidos, 5 são triptofanos P32626 tem 227 aminoácidos, 1 são triptofanos P40370 tem 439 aminoácidos, 7 são triptofanos
Escrita¶
Função print()
para ficheiros¶
Basta abrir o ficheiro em modo de escrita usando o argumento w
na
função open()
. Depois, modificar a função print()
, com o argumento
file
, indicando que o resultado da escrita deve ser enviado para o
ficheiro.
with open('exp.txt', 'w') as a: print('1, 2, 3, experiência, som, som', file=a) for i in range(30): print(i, i**0.5, file=a)
Aparentemente não aconteceu nada, mas um ficheiro novo foi criado
Vamos ler o ficheiro:
with open('exp.txt') as a: print(a.read())
1, 2, 3, experiência, som, som 0 0.0 1 1.0 2 1.4142135623730951 3 1.7320508075688772 4 2.0 5 2.23606797749979 6 2.449489742783178 7 2.6457513110645907 8 2.8284271247461903 9 3.0 10 3.1622776601683795 11 3.3166247903554 12 3.4641016151377544 13 3.605551275463989 14 3.7416573867739413 15 3.872983346207417 16 4.0 17 4.123105625617661 18 4.242640687119285 19 4.358898943540674 20 4.47213595499958 21 4.58257569495584 22 4.69041575982343 23 4.795831523312719 24 4.898979485566356 25 5.0 26 5.0990195135927845 27 5.196152422706632 28 5.291502622129181 29 5.385164807134504
Função .write()
¶
Também existe a função .write()
que funciona como o contrário de
.read()
:
tudo = """ Um texto que ocupa 1 linha 2 linhas 3 linhas """ with open('exp2.txt', 'w') as a: a.write(tudo) with open('exp2.txt') as a: print(a.read())
Um texto que ocupa 1 linha 2 linhas 3 linhas
Problema: ler uma ficheiro com dados numéricos e converter o ponto decimal em vírgula decimal
No ficheiro exp.txt
, recentemente criado, podemos, de uma form
sucinta, passar os .
a ,
?
with open('exp.txt') as a: tudo = a.read().replace('.', ',') with open('exp.txt', 'w') as a: a.write(tudo) with open('exp.txt') as a: print(a.read())
1, 2, 3, experiência, som, som 0 0,0 1 1,0 2 1,4142135623730951 3 1,7320508075688772 4 2,0 5 2,23606797749979 6 2,449489742783178 7 2,6457513110645907 8 2,8284271247461903 9 3,0 10 3,1622776601683795 11 3,3166247903554 12 3,4641016151377544 13 3,605551275463989 14 3,7416573867739413 15 3,872983346207417 16 4,0 17 4,123105625617661 18 4,242640687119285 19 4,358898943540674 20 4,47213595499958 21 4,58257569495584 22 4,69041575982343 23 4,795831523312719 24 4,898979485566356 25 5,0 26 5,0990195135927845 27 5,196152422706632 28 5,291502622129181 29 5,385164807134504
Exemplo: Extração de informação de ficheiros de resultados de metabolómica.¶
MassTRIX, (Mass TRanslator into Pathways) [1] é um serviço online de tratamento de dados de metabolómica.
A funcionalidade primária é a identificação de compostos a partir de listas de massas e intensidades obtidas por análise de amostras biológics por Espectrometria de Massa.
O resultado da identificação é disponibilizado em vários ficheiros de texto. Num dos formatos, cada linha do ficheiro diz respeito a um pico de massa e apresenta, de entre outros, os compostos identificados com aquela massa, bem como as anotações das vias celulares em que esses compostos podem estar envolvidos.
Pretende-se ilustrar o uso programático da leitura de ficheiros e as operações com strings com um exemplo da extração da informação contida num desses ficheiros.
[1] K. Suhre and P. Schmitt-Kopplin (2008) MassTRIX: Mass TRanslator Into Pathways, Nucleic Acids Research, 36, Web Server issue, W481-W484.
Exploração do formato¶
Vamos ler o ficheiro masses.annotated.reformat.tsv
, separar todas as
linhas para uma lista e mostrar a primeira e a última:
name = 'masses.annotated.reformat.tsv' with open(name) as a: all_lines = [line.strip() for line in a] print('FIRST line ----------------------------') print(all_lines[0]) print('LAST line -----------------------------') print(all_lines[-1])
FIRST line ---------------------------- 154.97517 7.25775e+06 120.005768420091 4 154.975098039829#154.975098039829#154.975274805989 0.464333550973771#0.464333550973771#-0.676276005999922 C00988#HMDB00816#C02287 C2H5O6P#C2H5O6P#C3H4O5 2-Phosphoglycolate;Phosphoglycolic acid ([M-H]-)#Phosphoglycolic acid (see KEGG C00988); 2-phosphonooxyacetic acid [carboxylic acid] ([M-H]-)#Hydroxymalonate;Tartronic acid;Hydroxymalonic acid;2-Hydroxymalonate;2-Hydroxymalonic acid;2-Tartronic acid ([M+Cl35]-) ko00630;ko01100#null#null ;Glyoxylate and dicarboxylate metabolism;Metabolic pathways#null#null null#null#null LAST line ----------------------------- raw_mass peak_height corrected_mass npossible KEGG_mass ppm KEGG_cid KEGG_formula KEGG_name uniqueID C13 O18 N15 S34 Mg25 Mg26 Fe54 Fe57 Ca44 Cl37 K41 KEGG Pathways KEGG Pathways descriptions Compound in Organism(X)
Nas linhas deste ficheiro, os vários campos com informação estão
separados por tabs (o caractere \t
).
A última linha tem como informação os nomes de cada um destes campos
(raw_mass peak_height
etc)
Vamos dividir a linha 0 em várias partes, pelo separador \t
. As partes
obtidas são os vários campos de informação reltiva a um pico de MS.
Já agora, vamos obter os nomes de cada campo, fazendo o mesmo à última linha:
name = 'masses.annotated.reformat.tsv' with open(name) as a: all_lines = [line.strip() for line in a] headers = all_lines[-1].split('\t') for h in headers: print(h)
raw_mass peak_height corrected_mass npossible KEGG_mass ppm KEGG_cid KEGG_formula KEGG_name uniqueID C13 O18 N15 S34 Mg25 Mg26 Fe54 Fe57 Ca44 Cl37 K41 KEGG Pathways KEGG Pathways descriptions Compound in Organism(X)
name = 'masses.annotated.reformat.tsv' with open(name) as a: all_lines = [line.strip() for line in a] headers = all_lines[-1].split('\t') line0 = all_lines[0].split('\t') info = dict(zip(headers, line0)) for h in headers: print(h, ':', info[h])
raw_mass : 154.97517 peak_height : 7.25775e+06 corrected_mass : 120.005768420091 npossible : 4 KEGG_mass : 154.975098039829#154.975098039829#154.975274805989 ppm : 0.464333550973771#0.464333550973771#-0.676276005999922 KEGG_cid : C00988#HMDB00816#C02287 KEGG_formula : C2H5O6P#C2H5O6P#C3H4O5 KEGG_name : 2-Phosphoglycolate;Phosphoglycolic acid ([M-H]-)#Phosphoglycolic acid (see KEGG C00988); 2-phosphonooxyacetic acid [carboxylic acid] ([M-H]-)#Hydroxymalonate;Tartronic acid;Hydroxymalonic acid;2-Hydroxymalonate;2-Hydroxymalonic acid;2-Tartronic acid ([M+Cl35]-) uniqueID : C13 : O18 : N15 : S34 : Mg25 : Mg26 : Fe54 : Fe57 : Ca44 : Cl37 : K41 : KEGG Pathways : ko00630;ko01100#null#null KEGG Pathways descriptions : ;Glyoxylate and dicarboxylate metabolism;Metabolic pathways#null#null Compound in Organism(X) : null#null#null
Vamos extraír da linha 0
- a massa do pico "raw mass", (campo 0)
- a intensidade do pico, (campo 1)
- os IDs dos compostos, (campo 6)
- os nomes dos compostos (campo 8)
- os IDs das vias (campo 21)
- as descrições das vias (campo 22)
Havendo vários compostos possíveis em cada pico, é usado como separador
o caractere #
.
Podemos já separar a informação por composto.
name = 'masses.annotated.reformat.tsv' use_only = ['raw_mass', 'peak_height', 'KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] needs_split = ['KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] with open(name) as a: all_lines = [line.strip() for line in a] headers = all_lines[-1].split('\t') line0 = all_lines[0].split('\t') info = {} for h, i in zip(headers, line0): if h in use_only: info[h] = i for n in needs_split: info[n] = info[n].split('#') for h in use_only: print(h, ':', info[h])
raw_mass : 154.97517 peak_height : 7.25775e+06 KEGG_cid : ['C00988', 'HMDB00816', 'C02287'] KEGG_name : ['2-Phosphoglycolate;Phosphoglycolic acid ([M-H]-)', 'Phosphoglycolic acid (see KEGG C00988); 2-phosphonooxyacetic acid [carboxylic acid] ([M-H]-)', 'Hydroxymalonate;Tartronic acid;Hydroxymalonic acid;2-Hydroxymalonate;2-Hydroxymalonic acid;2-Tartronic acid ([M+Cl35]-)'] KEGG Pathways : ['ko00630;ko01100', 'null', 'null'] KEGG Pathways descriptions : [';Glyoxylate and dicarboxylate metabolism;Metabolic pathways', 'null', 'null']
Quanto à informação relativa às vias em que cada composto pode estar envolvido, podemos reparar que:
- Um composto pde ter várias vias, separadas por
;
. - Um composto pode não ter nenhuma via. neste caso, aparece a anotação "null".
Finalmente, vamos transformar a informação relativa às vias (quer os IDs quer as descrições) em listas.
Repare-se que ainda são strings e que usam como separador o ;
para
delimitar várias vias.
name = 'masses.annotated.reformat.tsv' use_only = ['raw_mass', 'peak_height', 'KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] needs_split = ['KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] needs_more_split = ['KEGG Pathways', 'KEGG Pathways descriptions'] with open(name) as a: all_lines = [line.strip() for line in a] headers = all_lines[-1].split('\t') line0 = all_lines[0].split('\t') info = {} for h, i in zip(headers, line0): if h in use_only: info[h] = i for n in needs_split: info[n] = info[n].split('#') for n in needs_more_split: info[n] = [p.split(';') for p in info[n]] for h in use_only: print(h, ':', info[h])
raw_mass : 154.97517 peak_height : 7.25775e+06 KEGG_cid : ['C00988', 'HMDB00816', 'C02287'] KEGG_name : ['2-Phosphoglycolate;Phosphoglycolic acid ([M-H]-)', 'Phosphoglycolic acid (see KEGG C00988); 2-phosphonooxyacetic acid [carboxylic acid] ([M-H]-)', 'Hydroxymalonate;Tartronic acid;Hydroxymalonic acid;2-Hydroxymalonate;2-Hydroxymalonic acid;2-Tartronic acid ([M+Cl35]-)'] KEGG Pathways : [['ko00630', 'ko01100'], ['null'], ['null']] KEGG Pathways descriptions : [['', 'Glyoxylate and dicarboxylate metabolism', 'Metabolic pathways'], ['null'], ['null']]
Agora tudo junto, aplicando ao ficheiro inteiro. Para controlo, podemos contar os compostos obtidos.
name = 'masses.annotated.reformat.tsv' use_only = ['raw_mass', 'peak_height', 'KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] needs_split = ['KEGG_cid', 'KEGG_name', 'KEGG Pathways', 'KEGG Pathways descriptions'] needs_more_split = ['KEGG Pathways', 'KEGG Pathways descriptions'] with open(name) as a: all_lines = [line.strip() for line in a] headers = all_lines[-1].split('\t') peaks = [] for line in all_lines[:-1]: info = {} line_parts = line.split('\t') for h, i in zip(headers, line_parts): if h in use_only: info[h] = i for n in needs_split: info[n] = info[n].split('#') for n in needs_more_split: info[n] = [p.strip(';').split(';') for p in info[n]] peaks.append(info) print('São', len(peaks), 'massas') print('\n---- Massa 0 -----') for h in use_only: print(h, ':', peaks[0][h])
São 482 massas ---- Massa 0 ----- raw_mass : 154.97517 peak_height : 7.25775e+06 KEGG_cid : ['C00988', 'HMDB00816', 'C02287'] KEGG_name : ['2-Phosphoglycolate;Phosphoglycolic acid ([M-H]-)', 'Phosphoglycolic acid (see KEGG C00988); 2-phosphonooxyacetic acid [carboxylic acid] ([M-H]-)', 'Hydroxymalonate;Tartronic acid;Hydroxymalonic acid;2-Hydroxymalonate;2-Hydroxymalonic acid;2-Tartronic acid ([M+Cl35]-)'] KEGG Pathways : [['ko00630', 'ko01100'], ['null'], ['null']] KEGG Pathways descriptions : [['Glyoxylate and dicarboxylate metabolism', 'Metabolic pathways'], ['null'], ['null']]
Correspondência compostos - vias¶
Agora com esta lista de dicionários chamada peaks
disponível
podemos centrar a informação em torrno dos compostos associados a vias.
Para isso vamos criar dois dicionários:
- um chamado
pathways
que associa cada Id de um composto a uma lista de Ids de vias e - outro chamado
descriptions
, que associa cada Id de via à sua descrição.
paths = {} descriptions = {} for k in peaks: for c, p, d in zip(k['KEGG_cid'], k['KEGG Pathways'], k['KEGG Pathways descriptions']): if p[0] == 'null': continue paths[c] = p for pId, desc in zip(p, d): descriptions[pId] = desc print('São', len(paths), 'compostos com anotações de vias') print('\n---------Alguns compostos:\n') for (i, c) in enumerate(paths): if i > 10: break print(c, '-->', paths[c]) print('\n---------Alguns compostos:\n') for (i, c) in enumerate(paths): if i > 10: break p_desc = [descriptions[p] for p in paths[c]] print(c, '-->', ' AND '.join(p_desc))
São 327 compostos com anotações de vias ---------Alguns compostos: C00988 --> ['ko00630', 'ko01100'] C16652 --> ['ko00982'] C16655 --> ['ko00982'] C01088 --> ['ko00770'] C01989 --> ['ko00630'] C02488 --> ['ko00620'] C02991 --> ['ko00051'] C03652 --> ['ko00760'] C03979 --> ['ko00051'] C06159 --> ['ko00051'] C16390 --> ['ko00760'] ---------Alguns compostos: C00988 --> Glyoxylate and dicarboxylate metabolism AND Metabolic pathways C16652 --> Drug metabolism - cytochrome P450 C16655 --> Drug metabolism - cytochrome P450 C01088 --> Pantothenate and CoA biosynthesis C01989 --> Glyoxylate and dicarboxylate metabolism C02488 --> Pyruvate metabolism C02991 --> Fructose and mannose metabolism C03652 --> Nicotinate and nicotinamide metabolism C03979 --> Fructose and mannose metabolism C06159 --> Fructose and mannose metabolism C16390 --> Nicotinate and nicotinamide metabolism
Utilização da informação¶
Agora com estes dois dicionários podemos responder a várias questões:
Exemplo: Como obter uma lista com nomes das vias, mas sem repetições?
names = [] for c in paths: for pId in paths[c]: name = descriptions[pId] if name not in names: names.append(name) # AS primeiras 20 vias: for name in names[:21]: print(name)
Glyoxylate and dicarboxylate metabolism Metabolic pathways Drug metabolism - cytochrome P450 Pantothenate and CoA biosynthesis Pyruvate metabolism Fructose and mannose metabolism Nicotinate and nicotinamide metabolism Phenylalanine metabolism Phenylalanine, tyrosine and tryptophan biosynthesis Phenylpropanoid biosynthesis Tropane, piperidine and pyridine alkaloid biosynthesis Glucosinolate biosynthesis Aminoacyl-tRNA biosynthesis Biosynthesis of phenylpropanoids Biosynthesis of alkaloids derived from shikimate pathway Biosynthesis of alkaloids derived from ornithine, lysine and nicotinic acid Biosynthesis of plant hormones ABC transporters Biosynthesis of plant secondary metabolites Alanine, aspartate and glutamate metabolism Tetracycline biosynthesis
Exemplo: Como obter um dicionário com os Ids das vias como chaves e o número de vezes que aparecem como valores?
counts = {} for c in paths: for pId in paths[c]: if pId in counts: counts[pId] = counts[pId] + 1 else: counts[pId] = 1 print('São', len(counts), 'vias') print('\n---------Algumas contagens:\n') for i, pId in zip(range(10), counts): print(counts[pId], '\t', pId, '\t', descriptions[pId])
São 150 vias ---------Algumas contagens: 8 ko00630 Glyoxylate and dicarboxylate metabolism 113 ko01100 Metabolic pathways 5 ko00982 Drug metabolism - cytochrome P450 4 ko00770 Pantothenate and CoA biosynthesis 4 ko00620 Pyruvate metabolism 17 ko00051 Fructose and mannose metabolism 6 ko00760 Nicotinate and nicotinamide metabolism 4 ko00360 Phenylalanine metabolism 6 ko00400 Phenylalanine, tyrosine and tryptophan biosynthesis 2 ko00940 Phenylpropanoid biosynthesis
Uma vez que counts
é um dicionário, não se aplica a noção de ordem e é
evidente que as vias não estão ordenadas segundo as contagens de
compostos.
Podemos obter as vias por ordem decrescente de compostos?
Para, por exemplo, obter as 20 vias mais abundantes em compostos?
Uma vez que os dicionários não estão associados a uma "ordenação", temos de trabalhar com listas.
Estratégia:
- Criar uma lista com os pares (contagens, Id da via)
- Ordenar a lista
counts_list = [(counts[k], k) for k in counts] #Controlo: 5 primeiros elementos, lista desordenada: for i in counts_list[:5]: print(i)
(8, 'ko00630') (113, 'ko01100') (5, 'ko00982') (4, 'ko00770') (4, 'ko00620')
counts_list.sort(reverse=True) # reverse=True indica que a ordenação é por ordem decrescente print('As 20 vias com mais compostos associados:\n') for c, pId in counts_list[:20]: print(c, ':', descriptions[pId])
As 20 vias com mais compostos associados: 113 : Metabolic pathways 24 : Biosynthesis of plant secondary metabolites 21 : Galactose metabolism 20 : alpha-Linolenic acid metabolism 18 : Biosynthesis of unsaturated fatty acids 17 : Biosynthesis of terpenoids and steroids 17 : Linoleic acid metabolism 17 : Starch and sucrose metabolism 17 : Ascorbate and aldarate metabolism 17 : Fructose and mannose metabolism 16 : Phosphotransferase system (PTS) 15 : Diterpenoid biosynthesis 15 : Steroid biosynthesis 14 : Biosynthesis of plant hormones 14 : Glycolysis / Gluconeogenesis 13 : ABC transporters 13 : Biosynthesis of alkaloids derived from shikimate pathway 13 : Biosynthesis of phenylpropanoids 13 : Amino sugar and nucleotide sugar metabolism 13 : Pentose and glucuronate interconversions
Como exemplo final, escrever um ficheiro que sumariza esta informação.
Problema: Escrever um ficheiro, chamado pathways.txt
com vários
campos, separados por \t
e uma via por linha.
As vias devem estar por ordem decrescente de ocorrência
Os campos são:
- O ID da via
- A descrição da via
- O número de ocorrências
- Os Ids dos compostos associados à via, separados por
;
file_name = 'pathways.txt' # associação entre ids de vias e lista de compostos compounds = {} for c in paths: for pId in paths[c]: if pId in compounds: compounds[pId].append(c) else: compounds[pId] = [c] # contagens de coorrências (número de compostos) counts = {} for Id in compounds: counts[Id] = len(compounds[Id]) # ordenar as contagens counts_list = [(counts[k], k) for k in counts] counts_list.sort(reverse=True) # escrever o ficheiro com a informação with open(file_name, 'w') as f: for c, Id in counts_list: print(Id, descriptions[Id], c, compounds[Id], file=f, sep='\t')
# verificar se correu bem... file_name = 'pathways.txt' with open(file_name) as a: linhas = a.readlines() print(linhas[14])
ko00010 Glycolysis / Gluconeogenesis 14 ['C00111', 'C00118', 'C00031', 'C00221', 'C00267', 'C00631', 'C00197', 'C00103', 'C00668', 'C01172', 'C05345', 'C00236', 'C01159', 'C16255']
Informação obtida por acesso à Internet: (módulo requests
)¶
import requests r = requests.get('http://www.uniprot.org/uniprot/P00924.fasta') print(r.text)
>sp|P00924|ENO1_YEAST Enolase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) OX=559292 GN=ENO1 PE=1 SV=3 MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGK GVLHAVKNVNDVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASR AAAAEKNVPLYKHLADLSKSKTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTF AEALRIGSEVYHNLKSLTKKRYGASAGNVGDEGGVAPNIQTAEEALDLIVDAIKAAGHDG KIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLADLYHSLMKRYPIVSIEDPFA EDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQIGTLSESIKAA QDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEEL GDNAVFAGENFHHGDKL
linhas = r.text.split('\n') if linhas[0].startswith('>'): cab = linhas[0] seq = ''.join(linhas[1:]) else: cab = "" seq = ''.join(linhas) print("cabeçalho: ", cab) print("sequência:") print(seq)
cabeçalho: >sp|P00924|ENO1_YEAST Enolase 1 OS=Saccharomyces cerevisiae (strain ATCC 204508 / S288c) OX=559292 GN=ENO1 PE=1 SV=3 sequência: MAVSKVYARSVYDSRGNPTVEVELTTEKGVFRSIVPSGASTGVHEALEMRDGDKSKWMGKGVLHAVKNVNDVIAPAFVKANIDVKDQKAVDDFLISLDGTANKSKLGANAILGVSLAASRAAAAEKNVPLYKHLADLSKSKTSPYVLPVPFLNVLNGGSHAGGALALQEFMIAPTGAKTFAEALRIGSEVYHNLKSLTKKRYGASAGNVGDEGGVAPNIQTAEEALDLIVDAIKAAGHDGKIKIGLDCASSEFFKDGKYDLDFKNPNSDKSKWLTGPQLADLYHSLMKRYPIVSIEDPFAEDDWEAWSHFFKTAGIQIVADDLTVTNPKRIATAIEKKAADALLLKVNQIGTLSESIKAAQDSFAAGWGVMVSHRSGETEDTFIADLVVGLRTGQIKTGAPARSERLAKLNQLLRIEEELGDNAVFAGENFHHGDKL
import requests r = requests.get('http://www.uniprot.org/uniprot/P00924.txt') print(r.text)
ID ENO1_YEAST Reviewed; 437 AA. AC P00924; D6VV34; P99013; DT 21-JUL-1986, integrated into UniProtKB/Swiss-Prot. DT 05-OCT-2010, sequence version 3. DT 28-MAR-2018, entry version 203. DE RecName: Full=Enolase 1; DE EC=4.2.1.11; DE AltName: Full=2-phospho-D-glycerate hydro-lyase 1; DE AltName: Full=2-phosphoglycerate dehydratase 1; GN Name=ENO1; Synonyms=ENOA, HSP48; OrderedLocusNames=YGR254W; GN ORFNames=G9160; OS Saccharomyces cerevisiae (strain ATCC 204508 / S288c) (Baker's yeast). OC Eukaryota; Fungi; Dikarya; Ascomycota; Saccharomycotina; OC Saccharomycetes; Saccharomycetales; Saccharomycetaceae; Saccharomyces. OX NCBI_TaxID=559292; RN [1] RP NUCLEOTIDE SEQUENCE [GENOMIC DNA]. RX PubMed=6256394; RA Holland M.J., Holland J.P., Thill G.P., Jackson K.A.; RT "The primary structures of two yeast enolase genes. Homology between RT the 5' noncoding flanking regions of yeast enolase and glyceraldehyde- RT 3-phosphate dehydrogenase genes."; RL J. Biol. Chem. 256:1385-1395(1981). RN [2] RP NUCLEOTIDE SEQUENCE [GENOMIC DNA]. RC STRAIN=ATCC 204508 / S288c; RX PubMed=9133741; RX DOI=10.1002/(SICI)1097-0061(19970330)13:4<369::AID-YEA81>3.0.CO;2-V; RA Mazzoni C., Ruzzi M., Rinaldi T., Solinas F., Montebove F., RA Frontali L.; RT "Sequence analysis of a 10.5 kb DNA fragment from the yeast chromosome RT VII reveals the presence of three new open reading frames and of a RT tRNAThr gene."; RL Yeast 13:369-372(1997). RN [3] RP NUCLEOTIDE SEQUENCE [LARGE SCALE GENOMIC DNA]. RC STRAIN=ATCC 204508 / S288c; RX PubMed=9169869; RA Tettelin H., Agostoni-Carbone M.L., Albermann K., Albers M., RA Arroyo J., Backes U., Barreiros T., Bertani I., Bjourson A.J., RA Brueckner M., Bruschi C.V., Carignani G., Castagnoli L., Cerdan E., RA Clemente M.L., Coblenz A., Coglievina M., Coissac E., Defoor E., RA Del Bino S., Delius H., Delneri D., de Wergifosse P., Dujon B., RA Durand P., Entian K.-D., Eraso P., Escribano V., Fabiani L., RA Fartmann B., Feroli F., Feuermann M., Frontali L., Garcia-Gonzalez M., RA Garcia-Saez M.I., Goffeau A., Guerreiro P., Hani J., Hansen M., RA Hebling U., Hernandez K., Heumann K., Hilger F., Hofmann B., RA Indge K.J., James C.M., Klima R., Koetter P., Kramer B., Kramer W., RA Lauquin G., Leuther H., Louis E.J., Maillier E., Marconi A., RA Martegani E., Mazon M.J., Mazzoni C., McReynolds A.D.K., RA Melchioretto P., Mewes H.-W., Minenkova O., Mueller-Auer S., RA Nawrocki A., Netter P., Neu R., Nombela C., Oliver S.G., Panzeri L., RA Paoluzi S., Plevani P., Portetelle D., Portillo F., Potier S., RA Purnelle B., Rieger M., Riles L., Rinaldi T., Robben J., RA Rodrigues-Pousada C., Rodriguez-Belmonte E., Rodriguez-Torres A.M., RA Rose M., Ruzzi M., Saliola M., Sanchez-Perez M., Schaefer B., RA Schaefer M., Scharfe M., Schmidheini T., Schreer A., Skala J., RA Souciet J.-L., Steensma H.Y., Talla E., Thierry A., Vandenbol M., RA van der Aart Q.J.M., Van Dyck L., Vanoni M., Verhasselt P., Voet M., RA Volckaert G., Wambutt R., Watson M.D., Weber N., Wedler E., Wedler H., RA Wipfli P., Wolf K., Wright L.F., Zaccaria P., Zimmermann M., RA Zollner A., Kleine K.; RT "The nucleotide sequence of Saccharomyces cerevisiae chromosome VII."; RL Nature 387:81-84(1997). RN [4] RP GENOME REANNOTATION. RC STRAIN=ATCC 204508 / S288c; RX PubMed=24374639; DOI=10.1534/g3.113.008995; RA Engel S.R., Dietrich F.S., Fisk D.G., Binkley G., Balakrishnan R., RA Costanzo M.C., Dwight S.S., Hitz B.C., Karra K., Nash R.S., Weng S., RA Wong E.D., Lloyd P., Skrzypek M.S., Miyasato S.R., Simison M., RA Cherry J.M.; RT "The reference genome sequence of Saccharomyces cerevisiae: Then and RT now."; RL G3 (Bethesda) 4:389-398(2014). RN [5] RP PROTEIN SEQUENCE OF 2-437. RX PubMed=7005235; RA Chin C.C.Q., Brewer J.M., Wold F.; RT "The amino acid sequence of yeast enolase."; RL J. Biol. Chem. 256:1377-1384(1981). RN [6] RP PROTEIN SEQUENCE OF 2-12. RC STRAIN=ATCC 26786 / X2180-1A; RA Sanchez J.-C., Golaz O., Schaller D., Morch F., Frutiger S., RA Hughes G.J., Appel R.D., Deshusses J., Hochstrasser D.F.; RL Submitted (AUG-1995) to UniProtKB. RN [7] RP PROTEIN SEQUENCE OF 30-47. RC STRAIN=ATCC 204508 / S288c; RX PubMed=7895733; DOI=10.1002/elps.11501501210; RA Garrels J.I., Futcher B., Kobayashi R., Latter G.I., Schwender B., RA Volpe T., Warner J.R., McLaughlin C.S.; RT "Protein identifications for a Saccharomyces cerevisiae protein RT database."; RL Electrophoresis 15:1466-1486(1994). RN [8] RP PROTEIN SEQUENCE OF 69-79. RC STRAIN=ATCC 38531 / Y41; RX PubMed=7737086; DOI=10.1002/elps.1150160124; RA Norbeck J., Blomberg A.; RT "Gene linkage of two-dimensional polyacrylamide gel electrophoresis RT resolved proteins from isogene families in Saccharomyces cerevisiae by RT microsequencing of in-gel trypsin generated peptides."; RL Electrophoresis 16:149-156(1995). RN [9] RP MUTAGENESIS OF LYS-346. RX PubMed=8634301; DOI=10.1021/bi952186y; RA Poyner R.R., Laughlin L.T., Sowa G.A., Reed G.H.; RT "Toward identification of acid/base catalysts in the active site of RT enolase: comparison of the properties of K345A, E168Q, and E211Q RT variants."; RL Biochemistry 35:1692-1699(1996). RN [10] RP MUTAGENESIS OF HIS-160. RX PubMed=11027610; DOI=10.1006/bbrc.2000.3618; RA Brewer J.M., Holland M.J., Lebioda L.; RT "The H159A mutant of yeast enolase 1 has significant activity."; RL Biochem. Biophys. Res. Commun. 276:1199-1202(2000). RN [11] RP SUBCELLULAR LOCATION. RX PubMed=11502169; DOI=10.1021/bi010277r; RA Grandier-Vazeille X., Bathany K., Chaignepain S., Camougrand N., RA Manon S., Schmitter J.-M.; RT "Yeast mitochondrial dehydrogenases are associated in a supramolecular RT complex."; RL Biochemistry 40:9758-9769(2001). RN [12] RP MUTAGENESIS OF HIS-160 AND ASN-208. RX PubMed=13678299; DOI=10.1023/A:1025390123761; RA Brewer J.M., Glover C.V., Holland M.J., Lebioda L.; RT "Enzymatic function of loop movement in enolase: preparation and some RT properties of H159N, H159A, H159F, and N207A enolases."; RL J. Protein Chem. 22:353-361(2003). RN [13] RP LEVEL OF PROTEIN EXPRESSION [LARGE SCALE ANALYSIS]. RX PubMed=14562106; DOI=10.1038/nature02046; RA Ghaemmaghami S., Huh W.-K., Bower K., Howson R.W., Belle A., RA Dephoure N., O'Shea E.K., Weissman J.S.; RT "Global analysis of protein expression in yeast."; RL Nature 425:737-741(2003). RN [14] RP PHOSPHORYLATION [LARGE SCALE ANALYSIS] AT SER-119, AND IDENTIFICATION RP BY MASS SPECTROMETRY [LARGE SCALE ANALYSIS]. RX PubMed=17287358; DOI=10.1073/pnas.0607084104; RA Chi A., Huttenhower C., Geer L.Y., Coon J.J., Syka J.E.P., Bai D.L., RA Shabanowitz J., Burke D.J., Troyanskaya O.G., Hunt D.F.; RT "Analysis of phosphorylation sites on proteins from Saccharomyces RT cerevisiae by electron transfer dissociation (ETD) mass RT spectrometry."; RL Proc. Natl. Acad. Sci. U.S.A. 104:2193-2198(2007). RN [15] RP UBIQUITINATION [LARGE SCALE ANALYSIS] AT LYS-358, AND IDENTIFICATION RP BY MASS SPECTROMETRY [LARGE SCALE ANALYSIS]. RX PubMed=22106047; DOI=10.1002/pmic.201100166; RA Starita L.M., Lo R.S., Eng J.K., von Haller P.D., Fields S.; RT "Sites of ubiquitin attachment in Saccharomyces cerevisiae."; RL Proteomics 12:236-240(2012). RN [16] RP X-RAY CRYSTALLOGRAPHY (2.25 ANGSTROMS). RX PubMed=3374614; DOI=10.1038/333683a0; RA Lebioda L., Stec B.; RT "Crystal structure of enolase indicates that enolase and pyruvate RT kinase evolved from a common ancestor."; RL Nature 333:683-686(1988). RN [17] RP X-RAY CRYSTALLOGRAPHY (2.25 ANGSTROMS). RX PubMed=2645275; RA Lebioda L., Stec B., Brewer J.M.; RT "The structure of yeast enolase at 2.25-A resolution. An 8-fold beta + RT alpha-barrel with a novel beta beta alpha alpha (beta alpha)6 RT topology."; RL J. Biol. Chem. 264:3685-3693(1989). RN [18] RP X-RAY CRYSTALLOGRAPHY (2.25 ANGSTROMS). RX PubMed=2405163; DOI=10.1016/0022-2836(90)90023-F; RA Stec B., Lebioda L.; RT "Refined structure of yeast apo-enolase at 2.25-A resolution."; RL J. Mol. Biol. 211:235-248(1990). RN [19] RP X-RAY CRYSTALLOGRAPHY (1.8 ANGSTROMS) IN COMPLEX WITH SUBSTRATE AND RP MAGNESIUM IONS. RX PubMed=8605183; DOI=10.1021/bi952859c; RA Larsen T.M., Wedekind J.E., Rayment I., Reed G.H.; RT "A carboxylate oxygen of the substrate bridges the magnesium ions at RT the active site of enolase: structure of the yeast enzyme complexed RT with the equilibrium mixture of 2-phosphoglycerate and RT phosphoenolpyruvate at 1.8-A resolution."; RL Biochemistry 35:4349-4358(1996). RN [20] RP X-RAY CRYSTALLOGRAPHY (2.0 ANGSTROMS) IN COMPLEX WITH SUBSTRATE. RX PubMed=9376357; DOI=10.1021/bi9712450; RA Zhang E., Brewer J.M., Minor W., Carreira L.A., Lebioda L.; RT "Mechanism of enolase: the crystal structure of asymmetric dimer RT enolase-2-phospho-D-glycerate/enolase-phosphoenolpyruvate at 2.0-A RT resolution."; RL Biochemistry 36:12526-12534(1997). RN [21] RP X-RAY CRYSTALLOGRAPHY (2.1 ANGSTROMS) OF MUTANT ALA-40 IN COMPLEX WITH RP MAGNESIUM IONS AND SUBSTRATE ANALOG. RX PubMed=12054465; DOI=10.1016/S0003-9861(02)00024-3; RA Poyner R.R., Larsen T.M., Wong S.-W., Reed G.H.; RT "Functional and structural changes due to a serine to alanine mutation RT in the active-site flap of enolase."; RL Arch. Biochem. Biophys. 401:155-163(2002). RN [22] RP X-RAY CRYSTALLOGRAPHY (1.8 ANGSTROMS) OF MUTANT GLN-212 AND MUTANT RP GLN-169. RX PubMed=12846578; DOI=10.1021/bi0346345; RA Sims P.A., Larsen T.M., Poyner R.R., Cleland W.W., Reed G.H.; RT "Reverse protonation is the key to general acid-base catalysis in RT enolase."; RL Biochemistry 42:8298-8306(2003). CC -!- CATALYTIC ACTIVITY: 2-phospho-D-glycerate = phosphoenolpyruvate + CC H(2)O. CC -!- COFACTOR: CC Name=Mg(2+); Xref=ChEBI:CHEBI:18420; CC Note=Mg(2+) is required for catalysis and for stabilizing the CC dimer.; CC -!- PATHWAY: Carbohydrate degradation; glycolysis; pyruvate from D- CC glyceraldehyde 3-phosphate: step 4/5. CC -!- SUBUNIT: Homodimer. {ECO:0000269|PubMed:12054465, CC ECO:0000269|PubMed:8605183, ECO:0000269|PubMed:9376357}. CC -!- INTERACTION: CC P11484:SSB1; NbExp=3; IntAct=EBI-6468, EBI-8627; CC -!- SUBCELLULAR LOCATION: Cytoplasm {ECO:0000269|PubMed:11502169}. CC -!- MISCELLANEOUS: Present with 76700 molecules/cell in log phase SD CC medium. {ECO:0000269|PubMed:14562106}. CC -!- SIMILARITY: Belongs to the enolase family. {ECO:0000305}. CC ----------------------------------------------------------------------- CC Copyrighted by the UniProt Consortium, see https://www.uniprot.org/terms CC Distributed under the Creative Commons Attribution-NoDerivs License CC ----------------------------------------------------------------------- DR EMBL; J01322; AAA88712.1; -; Genomic_DNA. DR EMBL; X99228; CAA67616.1; -; Genomic_DNA. DR EMBL; Z73039; CAA97283.1; -; Genomic_DNA. DR EMBL; BK006941; DAA08345.1; -; Genomic_DNA. DR PIR; S64586; NOBY. DR RefSeq; NP_011770.3; NM_001181383.3. DR PDB; 1EBG; X-ray; 2.10 A; A/B=2-437. DR PDB; 1EBH; X-ray; 1.90 A; A/B=2-437. DR PDB; 1ELS; X-ray; 2.40 A; A=2-437. DR PDB; 1L8P; X-ray; 2.10 A; A/B/C/D=2-437. DR PDB; 1NEL; X-ray; 2.60 A; A=2-437. DR PDB; 1ONE; X-ray; 1.80 A; A/B=2-437. DR PDB; 1P43; X-ray; 1.80 A; A/B=2-437. DR PDB; 1P48; X-ray; 2.00 A; A/B=2-437. DR PDB; 2AL1; X-ray; 1.50 A; A/B=2-437. DR PDB; 2AL2; X-ray; 1.85 A; A/B=2-437. DR PDB; 2ONE; X-ray; 2.00 A; A/B=2-437. DR PDB; 2XGZ; X-ray; 1.80 A; A/B=2-437. DR PDB; 2XH0; X-ray; 1.70 A; A/B/C/D=2-437. DR PDB; 2XH2; X-ray; 1.80 A; A/B/C/D=2-437. DR PDB; 2XH4; X-ray; 1.70 A; A/B/C/D=2-437. DR PDB; 2XH7; X-ray; 1.80 A; A/B=2-437. DR PDB; 3ENL; X-ray; 2.25 A; A=2-437. DR PDB; 4ENL; X-ray; 1.90 A; A=2-437. DR PDB; 5ENL; X-ray; 2.20 A; A=2-437. DR PDB; 6ENL; X-ray; 2.20 A; A=2-437. DR PDB; 7ENL; X-ray; 2.20 A; A=2-437. DR PDBsum; 1EBG; -. DR PDBsum; 1EBH; -. DR PDBsum; 1ELS; -. DR PDBsum; 1L8P; -. DR PDBsum; 1NEL; -. DR PDBsum; 1ONE; -. DR PDBsum; 1P43; -. DR PDBsum; 1P48; -. DR PDBsum; 2AL1; -. DR PDBsum; 2AL2; -. DR PDBsum; 2ONE; -. DR PDBsum; 2XGZ; -. DR PDBsum; 2XH0; -. DR PDBsum; 2XH2; -. DR PDBsum; 2XH4; -. DR PDBsum; 2XH7; -. DR PDBsum; 3ENL; -. DR PDBsum; 4ENL; -. DR PDBsum; 5ENL; -. DR PDBsum; 6ENL; -. DR PDBsum; 7ENL; -. DR ProteinModelPortal; P00924; -. DR SMR; P00924; -. DR BioGrid; 33505; 132. DR DIP; DIP-5561N; -. DR IntAct; P00924; 105. DR MINT; P00924; -. DR STRING; 4932.YGR254W; -. DR Allergome; 786; Sac c Enolase. DR CarbonylDB; P00924; -. DR iPTMnet; P00924; -. DR COMPLUYEAST-2DPAGE; P00924; -. DR SWISS-2DPAGE; P00924; -. DR UCD-2DPAGE; P00924; -. DR MaxQB; P00924; -. DR PaxDb; P00924; -. DR PRIDE; P00924; -. DR TopDownProteomics; P00924; -. DR EnsemblFungi; YGR254W; YGR254W; YGR254W. DR GeneID; 853169; -. DR KEGG; sce:YGR254W; -. DR EuPathDB; FungiDB:YGR254W; -. DR SGD; S000003486; ENO1. DR GeneTree; ENSGT00910000144064; -. DR HOGENOM; HOG000072174; -. DR InParanoid; P00924; -. DR KO; K01689; -. DR OMA; EFMIIPV; -. DR OrthoDB; EOG092C2W5X; -. DR BioCyc; YEAST:YGR254W-MONOMER; -. DR BRENDA; 4.2.1.11; 984. DR SABIO-RK; P00924; -. DR UniPathway; UPA00109; UER00187. DR EvolutionaryTrace; P00924; -. DR PRO; PR:P00924; -. DR Proteomes; UP000002311; Chromosome VII. DR GO; GO:0000324; C:fungal-type vacuole; IDA:SGD. DR GO; GO:0005739; C:mitochondrion; IDA:SGD. DR GO; GO:0000015; C:phosphopyruvate hydratase complex; IDA:SGD. DR GO; GO:0000287; F:magnesium ion binding; IEA:InterPro. DR GO; GO:0004634; F:phosphopyruvate hydratase activity; IMP:SGD. DR GO; GO:0006094; P:gluconeogenesis; IEP:SGD. DR GO; GO:0006096; P:glycolytic process; IMP:SGD. DR GO; GO:0032889; P:regulation of vacuole fusion, non-autophagic; IDA:SGD. DR CDD; cd03313; enolase; 1. DR Gene3D; 3.20.20.120; -; 1. DR Gene3D; 3.30.390.10; -; 1. DR HAMAP; MF_00318; Enolase; 1. DR InterPro; IPR000941; Enolase. DR InterPro; IPR036849; Enolase-like_C_sf. DR InterPro; IPR029017; Enolase-like_N. DR InterPro; IPR034390; Enolase-like_superfamily. DR InterPro; IPR020810; Enolase_C. DR InterPro; IPR020809; Enolase_CS. DR InterPro; IPR020811; Enolase_N. DR PANTHER; PTHR11902; PTHR11902; 1. DR Pfam; PF00113; Enolase_C; 1. DR Pfam; PF03952; Enolase_N; 1. DR PIRSF; PIRSF001400; Enolase; 1. DR PRINTS; PR00148; ENOLASE. DR SFLD; SFLDG00178; enolase; 1. DR SFLD; SFLDS00001; Enolase; 1. DR SMART; SM01192; Enolase_C; 1. DR SMART; SM01193; Enolase_N; 1. DR SUPFAM; SSF51604; SSF51604; 1. DR TIGRFAMs; TIGR01060; eno; 1. DR PROSITE; PS00164; ENOLASE; 1. PE 1: Evidence at protein level; KW 3D-structure; Complete proteome; Cytoplasm; Direct protein sequencing; KW Glycolysis; Isopeptide bond; Lyase; Magnesium; Metal-binding; KW Phosphoprotein; Reference proteome; Ubl conjugation. FT INIT_MET 1 1 Removed. {ECO:0000269|PubMed:7005235, FT ECO:0000269|Ref.6}. FT CHAIN 2 437 Enolase 1. FT /FTId=PRO_0000134062. FT REGION 373 376 Substrate binding. FT ACT_SITE 212 212 Proton donor. {ECO:0000305}. FT ACT_SITE 346 346 Proton acceptor. FT METAL 247 247 Magnesium. {ECO:0000269|PubMed:8605183}. FT METAL 296 296 Magnesium. {ECO:0000269|PubMed:8605183}. FT METAL 321 321 Magnesium. {ECO:0000269|PubMed:8605183}. FT BINDING 160 160 Substrate. {ECO:0000269|PubMed:8605183, FT ECO:0000269|PubMed:9376357}. FT BINDING 169 169 Substrate. {ECO:0000269|PubMed:8605183, FT ECO:0000269|PubMed:9376357}. FT BINDING 296 296 Substrate. {ECO:0000269|PubMed:8605183, FT ECO:0000269|PubMed:9376357}. FT BINDING 321 321 Substrate. {ECO:0000269|PubMed:8605183, FT ECO:0000269|PubMed:9376357}. FT BINDING 397 397 Substrate. {ECO:0000269|PubMed:8605183, FT ECO:0000269|PubMed:9376357}. FT MOD_RES 119 119 Phosphoserine. FT {ECO:0000244|PubMed:17287358}. FT MOD_RES 138 138 Phosphoserine. FT {ECO:0000250|UniProtKB:P00925}. FT MOD_RES 188 188 Phosphoserine. FT {ECO:0000250|UniProtKB:P00925}. FT MOD_RES 313 313 Phosphothreonine. FT {ECO:0000250|UniProtKB:P00925}. FT MOD_RES 324 324 Phosphothreonine. FT {ECO:0000250|UniProtKB:P00925}. FT CROSSLNK 60 60 Glycyl lysine isopeptide (Lys-Gly) FT (interchain with G-Cter in ubiquitin). FT {ECO:0000250|UniProtKB:P00925}. FT CROSSLNK 243 243 Glycyl lysine isopeptide (Lys-Gly) FT (interchain with G-Cter in ubiquitin). FT {ECO:0000250|UniProtKB:P00925}. FT CROSSLNK 358 358 Glycyl lysine isopeptide (Lys-Gly) FT (interchain with G-Cter in ubiquitin). FT {ECO:0000244|PubMed:22106047}. FT MUTAGEN 40 40 S->A: Reduces activity by 99.9%. FT MUTAGEN 160 160 H->A,F,N: Reduces activity by 99%. FT {ECO:0000269|PubMed:11027610, FT ECO:0000269|PubMed:13678299}. FT MUTAGEN 169 169 E->Q: Reduces Kcat over 100000-fold. FT MUTAGEN 208 208 N->A: Reduces activity by 44%. FT {ECO:0000269|PubMed:13678299}. FT MUTAGEN 212 212 E->Q: Reduces Kcat over 100000-fold. FT MUTAGEN 346 346 K->A: Reduces Kcat over 100000-fold. FT Abolishes of the proton exchange reaction FT that initiates the enzymatic reaction. FT {ECO:0000269|PubMed:8634301}. FT CONFLICT 242 242 I -> V (in Ref. 1; AAA88712). FT {ECO:0000305}. FT STRAND 5 12 {ECO:0000244|PDB:2AL1}. FT STRAND 18 26 {ECO:0000244|PDB:2AL1}. FT STRAND 29 34 {ECO:0000244|PDB:2AL1}. FT STRAND 43 45 {ECO:0000244|PDB:1EBH}. FT HELIX 57 59 {ECO:0000244|PDB:2AL1}. FT HELIX 63 71 {ECO:0000244|PDB:2AL1}. FT HELIX 73 80 {ECO:0000244|PDB:2AL1}. FT HELIX 87 98 {ECO:0000244|PDB:2AL1}. FT STRAND 100 102 {ECO:0000244|PDB:1EBH}. FT TURN 104 106 {ECO:0000244|PDB:2AL1}. FT HELIX 108 125 {ECO:0000244|PDB:2AL1}. FT HELIX 130 138 {ECO:0000244|PDB:2AL1}. FT STRAND 145 147 {ECO:0000244|PDB:2AL1}. FT STRAND 152 156 {ECO:0000244|PDB:2AL1}. FT HELIX 158 160 {ECO:0000244|PDB:2AL1}. FT STRAND 161 164 {ECO:0000244|PDB:2AL1}. FT STRAND 169 173 {ECO:0000244|PDB:2AL1}. FT HELIX 180 202 {ECO:0000244|PDB:2AL1}. FT HELIX 204 207 {ECO:0000244|PDB:2AL1}. FT STRAND 213 215 {ECO:0000244|PDB:1P48}. FT HELIX 222 236 {ECO:0000244|PDB:2AL1}. FT TURN 239 241 {ECO:0000244|PDB:2AL1}. FT STRAND 243 247 {ECO:0000244|PDB:2AL1}. FT HELIX 250 253 {ECO:0000244|PDB:2AL1}. FT TURN 261 264 {ECO:0000244|PDB:2AL1}. FT HELIX 270 272 {ECO:0000244|PDB:2AL1}. FT HELIX 276 289 {ECO:0000244|PDB:2AL1}. FT STRAND 292 296 {ECO:0000244|PDB:2AL1}. FT HELIX 304 311 {ECO:0000244|PDB:2AL1}. FT TURN 312 314 {ECO:0000244|PDB:2AL2}. FT STRAND 316 321 {ECO:0000244|PDB:2AL1}. FT TURN 322 326 {ECO:0000244|PDB:2AL1}. FT HELIX 328 336 {ECO:0000244|PDB:2AL1}. FT STRAND 341 345 {ECO:0000244|PDB:2AL1}. FT HELIX 347 350 {ECO:0000244|PDB:2AL1}. FT HELIX 353 365 {ECO:0000244|PDB:2AL1}. FT STRAND 369 373 {ECO:0000244|PDB:2AL1}. FT HELIX 383 390 {ECO:0000244|PDB:2AL1}. FT STRAND 394 397 {ECO:0000244|PDB:2AL1}. FT HELIX 404 420 {ECO:0000244|PDB:2AL1}. FT HELIX 421 423 {ECO:0000244|PDB:2AL1}. FT STRAND 424 426 {ECO:0000244|PDB:2AL1}. FT HELIX 428 430 {ECO:0000244|PDB:2AL1}. FT HELIX 434 436 {ECO:0000244|PDB:2AL1}. SQ SEQUENCE 437 AA; 46816 MW; 69F45214DBD375BE CRC64; MAVSKVYARS VYDSRGNPTV EVELTTEKGV FRSIVPSGAS TGVHEALEMR DGDKSKWMGK GVLHAVKNVN DVIAPAFVKA NIDVKDQKAV DDFLISLDGT ANKSKLGANA ILGVSLAASR AAAAEKNVPL YKHLADLSKS KTSPYVLPVP FLNVLNGGSH AGGALALQEF MIAPTGAKTF AEALRIGSEV YHNLKSLTKK RYGASAGNVG DEGGVAPNIQ TAEEALDLIV DAIKAAGHDG KIKIGLDCAS SEFFKDGKYD LDFKNPNSDK SKWLTGPQLA DLYHSLMKRY PIVSIEDPFA EDDWEAWSHF FKTAGIQIVA DDLTVTNPKR IATAIEKKAA DALLLKVNQI GTLSESIKAA QDSFAAGWGV MVSHRSGETE DTFIADLVVG LRTGQIKTGA PARSERLAKL NQLLRIEEEL GDNAVFAGEN FHHGDKL //
Problema:
- obter a informação relativa à proteína P00924
- filtar a linha começada por SQ
- mostar o numero de aminoácidos e a massa molecular.
A informação relativa ao formato desta linha (embora seja evidente olhando para um exemplo) está descrita na documentação da UniProt
A linha tem o formato
SQ SEQUENCE XXXX AA; XXXXX MW; XXXXXXXXXXXXXXXX CRC64;
import requests info = requests.get('http://www.uniprot.org/uniprot/P00924.txt').text linhas = info.split('\n') sq = '' for i in linhas: if i.startswith('SQ'): sq = i print('linha SQ:') print(sq) # SQ SEQUENCE XXXX AA; XXXXX MW; XXXXXXXXXXXXXXXX CRC64; partes = sq.split() print(partes[2], 'aminoácidos') print(partes[4], 'Da')
linha SQ: SQ SEQUENCE 437 AA; 46816 MW; 69F45214DBD375BE CRC64; 437 aminoácidos 46816 Da
Na documentação da
UniProt, realtiva às
linhas começadas por FT
pode-se ler...
INIT_MET - Initiator methionine. This feature key is associated with a '1' value in the 'FROM' and 'TO' fields to indicate that the initiator methionine has been cleaved off: FT INIT_MET 1 1 Removed. It is not used when the initiator methionine is not cleaved off
Problema:
Para as seguintes proteínas,
Q96UH7, Q8J0N6, Q9URB4, Q9C2U0, P36580, P14540
gerar uma tabela com
AC AA MW init M cleaved