Τα δεδομένα τα οποία χρειάζεται ένα πρόγραμμα μπορούν να διαβαστούν από ένα αρχείο. Επίσης τα αποτελέσματα τα οποία παράγονται μπορούν να καταγραφούν (να εκτυπωθούν) σε αρχείο.
Συνδέουμε ένα υπάρχον αρχείο (έστω ότι ονομάζεται test.txt
) με την εντολή open
δηλώνοντας ότι πρόκειται να γίνει ανάγνωση δεδομένων.
Το πρόγραμμά μας έχει πρόσβαση στο αρχείο μέσω ενός νέου αντικειμένου της python στο οποίο θα δώσουμε το όνομα fh.
Από εδώ και κάτω μπορούμε να επεμβαίνουμε στο αρχείο χρησιμοποιώντας την μεταβλητή fh.
Υπάρχουν αρκετές μέθοδοι για την ανάγνωση αρχείου.
readlines
.readlines
το περιεχόμενο του αρχείου διαβάζεται και κάθε γραμμή του αποθηκεύεται ως στοιχείο μίας λίστας L.
fh = open('test.txt','r')
L = fh.readlines()
fh.close()
for e in L:
e1 = e.strip()
print(e1)
Ακολουθήσαμε τα εξής βήματα.
open
) το αρχείο με όνομα test.dat
δηλώνοντας ότι θα διαβάσουμε από αυτό ('r'
' - read).readlines()
στο αρχείο και το περιεχόμενό του πηγαίνει στη λίστα L. Κάθε γραμμή του αρχείου θα είναι ένα στοιχείο της λίστας.fh.close()
).\n
(αλλαγή γραμμής). Για να μην περιλαμβάνεται αυτός ο χαρακτήρας (αποφύγουμε την αλλαγή γραμμής) χρησιμοποιούμε την μέθοδο strip()
πριν εκτυπώσουμε (print
).
Το αρχείο για εγγραφή δεδομένων θα συνδεθεί στο πρόγραμμά μας μέσω της εντολής open
(όπως και στην περίπτωση ανάγνωσης).
fh = open('filename.dat','w')
Η παραπάνω εντολή δημιουργεί αρχείο με όνομα filename.dat
με σκοπό να γραφούν ('w'
- write) στο αρχείο νέα δεδομένα.
Το πρόγραμμά μας έχει πρόσβαση στο αρχείο μέσω ενός νέου αντικειμένου της python στο οποίο δώσαμε το όνομα fh.
Από εδώ και κάτω μπορούμε να επεμβαίνουμε στο αρχείο (με το όνομα filename.dat
) χρησιμοποιώντας την μεταβλητή fh.
import math
fh = open('test.dat','w')
for i in range(10):
s = '{} {} {}\n'.format(i,i**2,math.sqrt(i))
fh.write(s)
fh.close()
Ακολουθήσαμε τα εξής βήματα:
open
) δηλώνοντας ότι θα γράψουμε σε αυτό ('w'
- write).write
γράφει στο αρχείο τη συμβολοσειρά s.close
τερματίζει τη σύνδεση του αρχείου με το πρόγραμμα (επίσης φέρνει το αρχείο στην τελική του μορφή).
import math
fh = open('test.dat','w')
for i in range(10):
s = '{} {} {}\n'.format(i,i**2,math.sqrt(i))
fh.write(s)
fh.close()
Διαβάστε το αρχείο και εκχωρήστε σε μεταβλητές κάθε έναν από τους τρεις αριθμούς σε μία γραμμή του αρχείου. Ακολούθως ελέγξτε αν πραγματικά ο 2ος αριθμός είναι το τετράγωνο του πρώτου και ο τρίτος είναι η τετραγωνική του ρίζα.
import math
fh = open('test.dat','r')
L = fh.readlines()
fh.close()
for e in L:
e1 = e.split()
i = int(e1[0])
i2 = int(e1[1])
isq = float(e1[2])
if i2 != i**2:
print('error in square')
elif abs(isq-math.sqrt(i))>1e-3:
print('error in square root')
else:
print(i,i2,isq)
read
.
fh = open('test.txt','r')
s = fh.read()
fh.close()
print(s)
Ακολουθήσαμε τα εξής βήματα:
open
) δηλώνοντας ότι θα διαβάσουμε από αυτό ('r'
- read).fh.read()
) και το περιεχόμενο πηγαίνει στη μεταβλητή s
close
τερματίζει τη σύνδεση του αρχείου με το πρόγραμμα.Είναι συχνά χρήσιμο να έχουμε χωριστά κάθε γραμμή του αρχείου το οποίο διαβάζουμε.
Αυτό μπορούμε να το πετύχουμε με την μέθοδο splitlines
,
η οποία δημιουγεί μία λίστα με στοιχεία τις γραμμές του αρχείου.
fh = open('test.txt','r')
s = fh.read()
fh.close()
L = s.splitlines()
for e in L: print(e)
readline
.
fh = open('test.txt','r')
while True:
s = fh.readline()
if s == '': break
s = s.strip()
print(s)
fh.close()
Ακολουθήσαμε τα εξής βήματα:
open
) δηλώνοντας ότι θα διαβάσουμε από αυτό.while
) διαβάζοντας διαδοχικές γραμμές με τη μέθοδο readline()
και το περιεχόμενο πηγαίνει στη μεταβλητή s η οποία είναι συμβολοσειρά.readline
θα δώσει μία κενή συμβολοσειρά (συμβολοσειρά μηδενικού μήκους). Αυτό το εκμεταλλευόμαστε ως κριτήριο για να λήξει η ανακύκλωση.\n
. Για να απαλοίψουμε αυτόν τον χαρακτήρα χρησιμοποιούμε την μέθοδο strip
.
fh = open('test.dat','r')
for line in fh:
print(line.strip())
fh.close()
Ακολουθήσαμε τα εξής βήματα:
open
).for
) στις διαδοχικές γραμμές του αρχείου διατρέχοντας απευθείας το αντικείμενο του αρχείου fh.
fh = open('test.txt','a')
fh = open('test.dat','r+')
fh
είναι μια
λαβή αρχείου και filename
είναι μια ακολουθία χαρακτήρων η οποία περιέχει το όνομα του αρχείου το οποίο επεξεργαζόμαστε:
open(filename, 'w')
: δημιουργεί το αρχείο filename
(αν δεν υπάρχει ήδη) και το προετοιμάζει για
να δεχθεί καινούργια στοιχεία. Επιστρέφει μια λαβή στο αρχείο.open(filename, 'r')
: ανοίγει το αρχείο filename
(αν υπάρχει) και το προετοιμάζει για
ανάγνωση στοιχείων. Επιστρέφει μια λαβή στο αρχείο.open(filename, 'a')
: ανοίγει το αρχείο filename
και το προετοιμάζει για
να δεχθεί καινούργια στοιχεία. Επιστρέφει μια λαβή στο αρχείο.fh.read()
: επιστρέφει μια ακολουθία χαρακτήρων με τα περιεχόμενα του αρχείου με λαβή fh
.fh.readline()
: επιστρέφει ως ακολουθία χαρακτήρων την επόμενη γραμμή του αρχείου με λαβή fh
.fh.readlines()
: επιστρέφει μια λίστα στοιχεία της οποίας είναι οι γραμμές του αρχείου με λαβή fh
.fh.write(s)
: γράφει την ακολουθία χαρακτήρων s στο αρχείο με λαβή fh
.fh.writelines(seq)
: γράφει κάθε στοιχείο της ακολουθίας seq στο αρχείο με λαβή fh
.fh.close()
: κλείνει το αρχείο με λαβή fh
.Ο ακόλουθος κώδικας κατεβάζει τα δεδομένα ενός αρχείου στο διαδίκτυο και τα βάζει στην μεταβλητή data
.
import urllib.request # we need the library urllib
url = 'http://hplgit.github.com/bioinf-py/data/yeast_chr1.txt'
response = urllib.request.urlopen(url) # open specific URL
data = response.read() # reads bytes
text = data.decode('utf-8') # turns byte data to str
[Δείτε και έναν πιο λεπτομερή κώδικα.]
Γράφουμε τα δεδομένα της μεταβλητής text
σε ένα αρχείο, ώστε να τα έχουμε αποθηκευμένα στον υπολογιστή μας για μελλοντική επεξεργασία.
fh = open("yeast.txt","w")
fh.write(text)
fh.close()
Θα επεξεργαστούμε την ακολουθία DNA που αποθηκεύσαμε στο προηγούμενο παράδειγμα και θα μετρήσουμε την συχνότητα των βάσεων A, T, G, C που περιέχονται.
Διαβάζουμε σε μία συμβολοσειρά dna το περιεχόμενο του αρχείου (ένα μικρό τέτοιο αρχείο βρίσκεται εδώ).
fh = open("yeast.txt","r")
dna = fh.read()
Γράφουμε μία συνάρτηση η οποία βρίσκει την συχνότητα εμφάνισης των βάσεων A, T, G, C σε μία ακολουθία. Χρησιμοποιεί ένα λεξικό το οποίο έχει τέσσερες εγγραφές, μία για κάθε βάση. Δίνουμε το πλήρες πρόγραμμα το οποίο χρησιμοποιεί την συνάρτηση και τυπώνει την συχνότητα με την οποία εμφανίζεται κάθε βάση στην ακολουθία DNA.
def get_base_counts(dna):
counts = {'A': 0,'T': 0, 'G': 0, 'C': 0}
for base in dna:
if base in 'ATGC':
counts[base] += 1
return counts
fh = open("yeast_chr1.txt","r") # read DNA sequence from file
dna = fh.read()
counts = get_base_counts(dna) # call function to count occurrances of bases
dnaLength = 0 # count total length of DNA
for base in counts:
dnaLength += counts[base]
print("Total DNA bases:",dnaLength)
for base in counts: # print frequency of bases occurrances
print("Frequency for base",base,counts[base]/dnaLength)