ICE-B
13 - Ficheiros
Ludwig Krippahl
Ficheiros
Resumo
■ Organização de um disco.
• Sistema de ficheiros.
• Ficheiros de texto e binários.
■ Operações sobre ficheiros de texto.
• Simulação de digestão enzimática de ADN
Ficheiros
Armazenamento não-volátil
Armazenamento
Armazenamento não-volátil
■ A memória RAM é volátil
• Rápida mas, sem alimentação, os dados perdem-se
■ No armazenamento não-volátil os dados persistem
• Disco rígido, SSD, pendisk, cartão de memória, ...
Organização dos ficheiros
■ No suporte, os ficheiros estão organizados em blocos de bytes
■ O hardware gere o acesso a esses blocos
■ O Sistema Operativo gere a organização desses blocos
■ O OS identifica cada ficheiro por um identificador único:
• /home/user/Documents/ICE-B-1718-2/Lectures/13-files.html
• C:\Documents\ICE-B-1718-2\Lectures\13-files.html
Armazenamento
Sistema de ficheiros
■ O OS identifica cada ficheiro por um identificador único:
• /home/user/Documents/ICE-B-1718-2/Lectures/13-files.html
• C:\Documents\ICE-B-1718-2\Lectures\13-files.html
■ O identificador do ficheiro é composto por:
• Caminho (directoria) onde está o ficheiro
• Nome do ficheiro
■ Não pode haver dois ficheiros com mesmo identificador
Em Python, o caminho pode ser com /
Armazenamento
Sistema de ficheiros
■ O caminho para o ficheiro pode ser absoluto, a partir da raiz
• /home/user/Documents/ICE-B-1718-2/Lectures/13-files.html
• C:\Documents\ICE-B-1718-2\Lectures\13-files.html
■ ou relativo:
• Pasta sob a pasta corrente: data/file.txt
• Pasta "acima" da pasta corrente: ../file.txt
• Pasta "ao lado" da pasta corrente: ../folder/file.txt
Armazenamento
Exemplo: disco rígido (HDD)
Um disco rígido tem várias superfícies magnetizáveis
Os bits são materializados no campo magnético induzido
Em clusters de sectors (e.g. cluster de 8 sectores de 512 bytes)
Armazenamento
■ O acesso ao disco é mais lento do que à RAM
• ~10ms "Seek" para a cabeça chegar à track
• ~2ms acesso para disco rodar até posição certa
• Transferência
■ Multiplicado por cada
"cluster"
• Mais lento se o disco estiver fragmentado
Ficheiro
Um ficheiro é uma sequência de bytes
■ Independentemente de como o hardware os armazena
■ Cada byte é um valor de 0 a 255
■ Independentemente do tipo de ficheiro
Todos os ficheiros são sequências de bytes
■ O que determina o "tipo" de ficheiro é apenas a forma de interpretar esses números
• Texto, som, imagem, vídeo, etc...
Ficheiro
■ Um ficheiro é uma sequência de bytes
• Informação no ficheiro (hexadecimal, 00-ff), codificado com UTF-8
Slide:Ficheiros h3:Resumo
Organização de um disco.
Sistema de ficheiros.
Ficheiros de texto e binários.
Operações sobre ficheiros de texto.
Simulação de digestão enzimática de ADN
00000000 53 6c 69 64 65 3a 46 69 63 68 65 69 72 6f 73 0a |Slide:Ficheiros.|
00000010 20 68 33 3a 52 65 73 75 6d 6f 0a 20 4f 72 67 61 | h3:Resumo. Orga|
00000020 6e 69 7a 61 c3 a7 c3 a3 6f 20 64 65 20 75 6d 20 |niza....o de um | 00000030 64 69 73 63 6f 2e 0a 20 20 53 69 73 74 65 6d 61 |disco.. Sistema|
00000040 20 64 65 20 66 69 63 68 65 69 72 6f 73 2e 0a 20 | de ficheiros.. | 00000050 20 46 69 63 68 65 69 72 6f 73 20 64 65 20 74 65 | Ficheiros de te|
00000060 78 74 6f 20 65 20 62 69 6e c3 a1 72 69 6f 73 2e |xto e bin..rios.|
00000070 0a 20 4f 70 65 72 61 c3 a7 c3 b5 65 73 20 73 6f |. Opera....es so|
00000080 62 72 65 20 66 69 63 68 65 69 72 6f 73 20 64 65 |bre ficheiros de|
00000090 20 74 65 78 74 6f 2e 0a 20 20 53 69 6d 75 6c 61 | texto.. Simula|
000000a0 c3 a7 c3 a3 6f 20 64 65 20 64 69 67 65 73 74 c3 |....o de digest.|
000000b0 a3 6f 20 65 6e 7a 69 6d c3 a1 74 69 63 61 20 64 |.o enzim..tica d|
000000c0 65 20 41 44 4e 0a |e ADN.|
Ficheiro
■ Um ficheiro é uma sequência de bytes
• Informação no ficheiro (hexadecimal, 00-ff), codificação própria (.wav)
RIFF4�iWAVEfmt @ � � fact data�i �� �x��)��s� �) 2� �I �e������
0b �"� �*!$#���(�'�����0�)�A �� ' �� �8%� ˭"
2'���Y �A��
00000000 52 49 46 46 34 9a 69 00 57 41 56 45 66 6d 74 20 |RIFF4.i.WAVEfmt | 00000010 14 00 00 00 11 00 01 00 40 1f 00 00 bb 0f 00 00 |...@...|
00000020 00 02 04 00 02 00 f9 03 66 61 63 74 04 00 00 00 |...fact....|
00000030 00 00 00 00 64 61 74 61 00 9a 69 00 08 00 00 00 |....data..i...|
00000040 9f f7 04 ff 78 83 80 29 a2 ba 73 dc 10 ba 29 12 |....x..)..s...).|
00000050 11 32 cb 12 bc 49 04 aa 65 b1 8a c1 9b 8a 8a 04 |.2...I..e...|
00000060 30 62 15 98 22 b8 0b f0 2a 21 24 23 89 f0 ad 28 |0b.."...*!$#...(|
00000070 c8 0a 27 88 88 b8 99 9c 30 85 29 00 e8 41 02 0a |..'...0.)..A..|
00000080 02 f8 8a 08 10 27 10 99 d9 0b 81 38 25 a0 01 cb |...'...8%...|
Ficheiros
Acesso a ficheiros em Python
Ficheiros de texto
Ler e escrever ficheiros de texto em Python
■ A função open(file, mode='r') recebe o nome do ficheiro
■ Devolve um objecto que permite o acesso ao ficheiro.
• Omitindo mode, o acesso é para leitura
• O objecto pode ser usado como iterador, linha a linha
• Devemos usar close para libertar o ficheiro
■ Ficheiro
enzymes.txt
in_file = open('enzymes.txt') for line in in_file:
print(line)
in_file.close() EcoRI;GAATTC;G-AATTC
EcoRII;CCWGG;-CCWGG
Ficheiros de texto
Ler e escrever ficheiros de texto em Python
■ Se o ficheiro cabe em memória é mais prático readlines
• O interpretador liberta o ficheiro quando apaga o objecto da memória
• Nota: as strings na lista mantém o terminador de linha
lines = open('enzymes.txt').readlines() print(lines)
['EcoRI;GAATTC;G-AATTC\n', 'EcoRII;CCWGG;-CCWGG\n', 'BamHI;GGATCC;G-GATCC\n', 'TaqI;TCGA;T-CGA\n', 'Sau3AI;GATC;-GATC\n', 'AluI;AGCT;AG-CT']
EcoRI;GAATTC;G-AATTC EcoRII;CCWGG;-CCWGG BamHI;GGATCC;G-GATCC TaqI;TCGA;T-CGA
Sau3AI;GATC;-GATC AluI;AGCT;AG-CT
Ficheiros de texto
Ler e escrever ficheiros de texto em Python
■ Para escrever um ficheiro de texto, abrir em modo 'w'
■ Nota: é preciso incluir a indicação de mudança de linha
• Os ficheiros são sequências de bytes.
• O byte 10 (ou 13+10 em Windows) é que indica mudança de linha.
• O interpretador converte \n no código adequado.
out_file = open('test.txt','w') out_file.write('some text')
out_file.write('some more text\n')
out_file.write('some more text \n with a new line') out_file.close()
Ficheiros binários
Ficheiros binários em Python
■ Leitura: open(nome,'rb')
■ Escrita: open(nome,'wb')
■ A diferença é que não se assume que possa ser lido linha a linha ou convertido em string
■ Não vamos lidar com estes ficheiros em ICE
• Excepto usando bibliotecas adequadas (e.g. ler imagens)
Ficheiros
Exemplo: digestão de ADN
Exemplo
Simular a digestão de ADN
■ Ficheiro sequences.txt com sequências:
ID-00:TGGACTTTGTTTGCACCGGGGCGCGAGTCGTACACCTATCTTGAGATGCAACTGA...
ID-01:CGGGGGACGCATCAGTTATGTTCGCTAAGACGAACTACAGTAACCGCTATATCCG...
ID-02:CCGATTAGACGCGGAAGCACACATAGAGAGCGTATCTTACTCTAGTTGTTGCCAA...
...
■ Ficheiro enzymes.txt com informação sobre enzimas
EcoRI;GAATTC;G-AATTC EcoRII;CCWGG;-CCWGG ...
■ Objectivo: criar um ficheiro para cada enzima com:
• Identificador da sequência, número de fragmentos
■ Ficheiros: EcoRI.txt, EcoRII.txt, BamHI.txt, ...
Exemplo
Plano do programa
■ Ler sequências para lista de tuplos, identificador e sequência
■ Ler enzimas para lista de tuplos: id, reconhecimento, corte
■ Digerir uma sequência com uma enzima
■ Gravar um ficheiro, para uma enzima
■ Gravar para todas as enzimas (função final, junta tudo)
Exemplo
Plano do programa
■ Ler sequências para lista de tuplos, identificador e sequência
def read_sequences(seq_file):
"""Read sequences file to list of tuples (id,sequence)"""
■ Ler enzimas para lista de tuplos: id, reconhecimento, corte
def read_enzymes(file_name):
"""Read enzyme data to list of tuples (id, recon,cut)"""
■ Digerir sequência:
def fragments(sequence,recon,cut):
"""Return a list of fragments from cutting the sequence"""
Exemplo
Plano do programa
■ Gravar um ficheiro, para uma enzima
def create_report(file_name,sequences,recon,cut):
"""Create report with number of fragments for one enzyme"""
■ Gravar para todas as enzimas (função final, junta tudo)
def create_all_reports(seq_file,enz_file):
"""Create one report file per enzyme, name.txt"""
■ Importante pensar primeiro no problema, decompor e planear o
encaixe das várias funções.
Exemplo, implementação
■ Ler ficheiro das sequências
• Nota: strip para tirar espaços e mudança de linha no final da string
def read_sequences(seq_file):
"Read sequences file to list of tuples (id,sequence)"
sequences = []
seq_lines = open(seq_file).readlines() for sl in seq_lines:
sid,seq = sl.split(':')
sequences.append( (sid,seq.strip()) ) return sequences
In : seqs = read_sequences('sequences.txt') In : seqs
Out: [('ID-00', 'TGGACT...'), ('ID-01', 'CGGGGG...'), ...]
Exemplo, implementação
■ Ler ficheiro com os dados das enzimas
def read_enzymes(file_name):
"""Read enzyme data to list of tuples (id, recon,cut)"""
enzymes = []
lines = open(file_name).readlines() for el in lines:
e_id,recon,cut = el.split(';')
enzymes.append( (e_id, recon, cut.strip()) ) return enzymes
In : enzymes = read_enzymes('enzymes.txt') Out : [('EcoRI', 'GAATTC', 'G-AATTC'), ('EcoRII', 'CCWGG', '-CCWGG'), ('BamHI', 'GGATCC', 'G-GATCC'), ('TaqI', 'TCGA', 'T-CGA'),
Exemplo, implementação
■ Digerir uma sequência com uma enzima
def fragments(sequence,recon,cut):
"""Return a list of fragments from cutting the sequence"""
marked = sequence.replace(recon,cut) return marked.split('-')
In : fragments('ACTTATTCTG','TT','T-T') Out: ['ACT', 'TAT', 'TCTG']
Exemplo, implementação
■ Criar ficheiro com relatório para uma enzima
def create_report(file_name,sequences,recon,cut):
"""Create report with number of fragments for one enzyme"""
ofil = open(file_name,'w') for seq_record in sequences:
seq_id,seq = seq_record
frags = fragments(seq,recon,cut)
ofil.write('{0}\t{1}\n'.format(seq_id, len(frags)) ) ofil.close()
■ Nota 1: não é preciso return (não devolve valor)
■ Nota 2: escrita formatada
• O método format permite usar uma string de formatação
Exemplo, implementação
■ Criar ficheiro com relatório para uma enzima
def create_report(file_name,sequences,recon,cut):
"""Create report with number of fragments for one enzyme"""
ofil = open(file_name,'w') for seq_record in sequences:
seq_id,seq = seq_record
frags = fragments(seq,recon,cut)
ofil.write('{0}\t{1}\n'.format(seq_id, len(frags)) ) ofil.close()
In : sequences = [('s1','ATTA'),('s2','ATTCTTA'),('s3','ACTTATTCTG')]
In : create_report('test.txt',sequences,'TT','T-T') In : print(open('test.txt').read())
s1 2 s2 3 s3 3
print(open(ficheiro).read())
■ Imprime o conteúdo do ficheiro lido como uma única string
Exemplo, implementação
■ Função final, todos os relatórios
def create_all_reports(seq_file,enz_file):
"""Create one report file per enzyme, name.txt"""
sequences = read_sequences(seq_file) enzymes = read_enzymes(enz_file)
for enzyme in enzymes:
enz_id,recon,cut = enzyme
create_report(enz_id+'.txt',sequences,recon,cut)
In : create_all_reports('sequences.txt','enzymes.txt')
(EcoRI.txt) ID-0 2 ID-1 1
(EcoRII.txt) ID-0 1 ID-1 1
(BamHI.txt) ID-0 1 ID-1 1
(TaqI.txt) ID-0 3 ID-1 3
Ficheiros
Resumo
Ficheiros
Resumo
■ Ficheiros: sequência de bytes identificada por caminho + nome
■ Ficheiros em Python: open
■ Leitura e escrita de ficheiros
• Não esquecer o close() se o objecto ficar guardado