Σημειώσεις

Προηγούμενο

Επόμενο

Αρχεία

Τα δεδομένα τα οποία χρειάζεται ένα πρόγραμμα μπορούν να διαβαστούν από ένα αρχείο. Επίσης τα αποτελέσματα τα οποία παράγονται μπορούν να καταγραφούν (να εκτυπωθούν) σε αρχείο.

Ανάγνωση δεδομένων

Συνδέουμε ένα υπάρχον αρχείο (έστω ότι ονομάζεται 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 (όπως και στην περίπτωση ανάγνωσης).


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()

Ακολουθήσαμε τα εξής βήματα:

Άσκηση.

Δημιουργούμε ένα αρχείο με τον ακόλουθο κώδικα.


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)

Ακολουθήσαμε τα εξής βήματα:

Είναι συχνά χρήσιμο να έχουμε χωριστά κάθε γραμμή του αρχείου το οποίο διαβάζουμε. Αυτό μπορούμε να το πετύχουμε με την μέθοδο 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()

Ακολουθήσαμε τα εξής βήματα:

Ανακύκλωση στο αντικείμενο του αρχείου.

Υπάρχει μία ακόμα διαδικασία για να διαβάσουμε ένα αρχείο χρησιμοποιώντας απευθείας το αντικείμενο του αρχείου.

Παράδειγμα.

Θα διαβάσουμε το περιεχόμενο ενός αρχείου κατά γραμμές.


fh = open('test.dat','r')
for line in fh:
    print(line.strip())
fh.close()

Ακολουθήσαμε τα εξής βήματα:

Άλλες διαδικασίες

Προσάρτηση δεδομένων.

Μπορούμε να ανοίξουμε ένα αρχείο για προσάρτηση (append) δεδομένων:


fh = open('test.txt','a')

Ανάγνωση και αποθήκευση.

Μπορούμε να ανοίξουμε ένα αρχείο για ανάγνωση και για αποθήκευση δεδομένων.


fh = open('test.dat','r+')

Σύνοψη

Συνοψίζουμε τις σημαντικότερες λειτουργίες για την επεξεργασία αρχείων. Υποθέτουμε ότι fh είναι μια λαβή αρχείου και filename είναι μια ακολουθία χαρακτήρων η οποία περιέχει το όνομα του αρχείου το οποίο επεξεργαζόμαστε:

Ανάγνωση και επεξεργασία ακολουθίας DNA

Παράδειγμα.

(Δείτε στο Illustrating Python via Bioinformatics Examples", Κεφ. 1.7) Θα κατεβάσουμε από το διαδίκτυο ένα αρχείο με την ακολουθία DNA ενός μικροοργανισμού και θα αποθηκεύσουμε το περιεχόμενό του σε ένα αρχείο.

Ο ακόλουθος κώδικας κατεβάζει τα δεδομένα ενός αρχείου στο διαδίκτυο και τα βάζει στην μεταβλητή 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)

Μελέτη

Βιβλιογραφία

  1. Python documentation.
  2. Σημειώσεις Μ. Πλεξουσάκη.
  3. J.V. Guttag, Υπολογισμοί και προγραμματισμός με την python.
  4. Δημήτριος Καρολίδης, Μαθαίνετε εύκολα python (Εκδόσεις Καρολίδη, 2016).
  5. Κ. Μαγκούτης, Χ. Νικολάου, Εισαγωγή στον αντικειμενοστραφή προγραμματισμό με Python, (Αποθετήριο "Κάλλιπος", 2016).