Ανάγνωση αρχείων με Python

Εισαγωγή

Για να εργαστείτε με αποθηκευμένα δεδομένα, ο χειρισμός αρχείων γίνεται η βασική γνώση κάθε επαγγελματία προγραμματιστή Python. Από την πρώτη του κυκλοφορία, τόσο η ανάγνωση όσο και η εγγραφή δεδομένων σε αρχεία είναι ενσωματωμένες λειτουργίες της Python. Σε σύγκριση με άλλες γλώσσες προγραμματισμού όπως η C ή η Java, είναι αρκετά απλό και απαιτεί μόνο μερικές γραμμές κώδικα. Επιπλέον, δεν χρειάζεται να φορτωθεί καμία επιπλέον μονάδα για να γίνει αυτό σωστά.

Σε αυτό το άρθρο θα εξηγήσουμε πώς να διαβάζουμε αρχεία με Python μέσα από παραδείγματα. Μερικά παραδείγματα περιλαμβάνουν την ανάγνωση ενός αρχείου γραμμή προς γραμμή, ως κομμάτι (ένας καθορισμένος αριθμός γραμμών κάθε φορά) και η ανάγνωση ενός αρχείου με μία κίνηση. Επίσης, θα σας δείξουμε έναν τρόπο για να διαβάσετε μια συγκεκριμένη γραμμή από το αρχείο, μόνο, χωρίς να κάνετε αναζήτηση ολόκληρου του αρχείου.

Βασικά Αρχεία στην Python

Οι συνήθεις μέθοδοι λειτουργίας με αρχεία είναι open() για να ανοίξετε ένα αρχείο, seek() για να ορίσετε την τρέχουσα θέση του αρχείου στη δεδομένη μετατόπιση και close() για να κλείσετε το αντικείμενο αρχείου όταν ολοκληρώσετε τη χρήση του. Το ενσωματωμένο open() Η λειτουργία επιστρέφει μια λαβή αρχείου που αντιπροσωπεύει ένα αντικείμενο αρχείου που θα χρησιμοποιηθεί για πρόσβαση στο αρχείο για ανάγνωση, εγγραφή ή προσθήκη.

Όταν ανοίγετε ένα αρχείο για ανάγνωση, η Python πρέπει να γνωρίζει ακριβώς πώς πρέπει να ανοίξει το αρχείο με το σύστημα. Διατίθενται δύο τρόποι πρόσβασης – ανάγνωση και ανάγνωση σε δυαδική λειτουργία. Οι αντίστοιχες σημαίες που χρησιμοποιούνται είναι 'r', να 'rb', και πρέπει να προσδιορίζονται κατά το άνοιγμα ενός αρχείου με το ενσωματωμένο open() λειτουργία. Η πρώτη λειτουργία περιλαμβάνει την ερμηνεία ειδικών χαρακτήρων όπως "CR" (carriage return) και "LF" (linefeed) για την αναπαράσταση των αλλαγών γραμμής, ενώ η δυαδική λειτουργία σάς επιτρέπει να διαβάζετε τα δεδομένα σε κατάσταση πρωτογενούς λειτουργίας - όπου τα δεδομένα αποθηκεύονται ως έχουν χωρίς περαιτέρω ερμηνεία.

Μόλις ανοίξετε ένα αρχείο, το open() η λειτουργία θα σας επιστρέψει ένα αντικείμενο αρχείου. Αυτά τα αντικείμενα αρχείων έχουν μεθόδους όπως read(), readline(), write(), tell(), να seek(). Ενώ ορισμένα αντικείμενα αρχείων (ή αντικείμενα που μοιάζουν με αρχείο) έχουν περισσότερες μεθόδους από αυτές που αναφέρονται εδώ, αυτές είναι οι πιο συνηθισμένες. Δεν χρειάζεται όλα τα αντικείμενα αρχείου να υλοποιούν όλες τις μεθόδους αρχείου.

Ανάγνωση ενός αρχείου γραμμή προς γραμμή

Το πρώτο παράδειγμα είναι εμπνευσμένο από τις δύο γλώσσες προγραμματισμού – C και C++. Είναι ίσως η πιο διαισθητική προσέγγιση – ανοίξτε το αρχείο χρησιμοποιώντας το open() λειτουργία, διαβάστε το αρχείο γραμμή προς γραμμή χρησιμοποιώντας τα readline() μέθοδο, και εξάγετε τη γραμμή αμέσως μετά την ανάγνωση.

Σε χρήση εδώ είναι ένα while βρόχος που διαβάζει συνεχώς από το αρχείο όσο το readline() μέθοδος συνεχίζει να επιστρέφει δεδομένα. Σε περίπτωση που φτάσει στο τέλος του φακέλου (ΕΟΦ) ο while Ο βρόχος σταματά και το αντικείμενο αρχείου κλείνει, ελευθερώνοντας τους πόρους για χρήση άλλων προγραμμάτων:


filename = "test.txt"

filehandle = open(filename, 'r')
while True:
    
    line = filehandle.readline()
    if not line:
        break
    print(line)


filehandle.close()

Όπως ίσως έχετε σημειώσει, έχουμε ανοίξει και κλείσει ρητά το αρχείο σε αυτό το παράδειγμα. Παρόλο που ο διερμηνέας Python κλείνει αυτόματα τα ανοιχτά αρχεία στο τέλος της εκτέλεσης του προγράμματος Python, κλείνοντας ρητά το αρχείο μέσω close() είναι καλό στυλ προγραμματισμού και δεν πρέπει να το ξεχνάμε.

Ως βελτίωση, το βολικό πρωτόκολλο επαναληπτικού εισήχθη στην Python 2.3. Αυτό σας επιτρέπει να απλοποιήσετε το readline βρόχος:


filename = "test.txt"
for line in open(filename, 'r'):
    print(line)

Σε χρήση εδώ είναι ένα for βρόχος σε συνδυασμό με το in επαναλήπτης. Η τρέχουσα γραμμή προσδιορίζεται με τη βοήθεια του in iterator, διαβάζεται από το αρχείο και το περιεχόμενό του εξάγεται σε stdout. Η Python καλύπτει το άνοιγμα και το κλείσιμο του αρχείου για εσάς όταν αυτό ξεφεύγει από το πεδίο εφαρμογής. Αν και είναι αναποτελεσματικό, αυτό σας επιτρέπει να μην χρειάζεται πλέον να αντιμετωπίζετε χειρισμούς αρχείων.

Δυστυχώς, ο παραπάνω κώδικας είναι λιγότερο σαφής και βασίζεται στην εσωτερική συλλογή σκουπιδιών της Python για να χειριστεί το κλείσιμο του αρχείου.

Παρουσιάστηκε στην Python 2.5, το with Η εντολή ενσωματώνει ακόμη περισσότερο ολόκληρη τη διαδικασία και χειρίζεται επίσης το άνοιγμα και το κλείσιμο αρχείων μόνο μία φορά σε όλο το εύρος του μπλοκ κώδικα:


filename = "test.txt"
with open(filename, 'r') as filehandle:
    for line in filehandle:
        print(line)

Ο συνδυασμός του with δήλωση και το open() εντολή ανοίγει το αρχείο μόνο μία φορά. Εάν είναι επιτυχής η for ο βρόχος εκτελείται και το περιεχόμενο της γραμμής τυπώνεται stdout.

Επιπλέον, η χρήση του with η δήλωση έχει μια παρενέργεια. Εσωτερικά, ο διερμηνέας Python δημιουργεί ένα try-finally-μπλοκ για να ενθυλακώσει την ανάγνωση από το αρχείο. Το παρακάτω παράδειγμα δείχνει τι συμβαίνει ουσιαστικά εσωτερικά στην Python με το with μπλοκ κωδικών:

try:
    filehandle = open(filename, 'r')
    
finally:
    filehandle.close()

Ανάγνωση ενός αρχείου ως κομμάτια γραμμών

Μέχρι τώρα, έχουμε επεξεργαστεί ένα αρχείο γραμμή προς γραμμή. Αυτό είναι μάλλον αργό για τεράστια αρχεία και μπορεί να βελτιωθεί διαβάζοντας πολλές γραμμές ταυτόχρονα. Για να επιτευχθεί αυτό, το islice() μέθοδο από το itertools η ενότητα μπαίνει στο παιχνίδι. Επίσης, λειτουργεί ως επαναλήπτης και επιστρέφει ένα κομμάτι δεδομένων που αποτελείται από n γραμμές. Στο τέλος του αρχείου, το αποτέλεσμα μπορεί να είναι μικρότερο και, τέλος, η κλήση θα επιστρέψει μια κενή λίστα:

from itertools import islice

filename = "test.txt"

number_of_lines = 5

with open(filename, 'r') as input_file:
    lines_cache = islice(input_file, number_of_lines)
   
    for current_line in lines_cache:
        print (current_line)

Διαβάζοντας μια συγκεκριμένη γραμμή από ένα αρχείο

Χρησιμοποιώντας τις μεθόδους που εμφανίζονται παραπάνω μπορούμε επίσης να εκτελέσουμε άλλες χρήσιμες ενέργειες, όπως η ανάγνωση μιας συγκεκριμένης γραμμής από ένα αρχείο. Για να το κάνουμε αυτό, χρησιμοποιούμε έναν μετρητή και εκτυπώνουμε την κατάλληλη γραμμή όταν φτάνουμε σε αυτόν ενώ επαναλαμβάνουμε το αρχείο:


filename = "test.txt"

line_number = 3
print (f"line {line_number} of {filename} is: ")

with open(filename, 'r') as filehandle:
current_line = 1
    for line in filehandle:
        if current_line == line_number:
            print(line)
            break
        current_line += 1

Αυτό θα πρέπει να είναι απλό στην κατανόηση, αλλά είναι λίγο μεγαλύτερο από τα προηγούμενα παραδείγματα. Μπορεί να συντομευτεί χρησιμοποιώντας το linecache μονάδα μέτρησης.

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


import linecache

filename = "test.txt"

line_number = 3

line = linecache.getline(filename, line_number)
print (f"line {line_number} of {filename}:")
print (line)

Διαβάζοντας ολόκληρο το αρχείο ταυτόχρονα

Τελευταίο, αλλά όχι λιγότερο σημαντικό, θα ρίξουμε μια ματιά σε μια πολύ διαφορετική περίπτωση από το προηγούμενο παράδειγμα – την ανάγνωση ολόκληρου του αρχείου με μια κίνηση.

Λάβετε υπόψη ότι στις περισσότερες περιπτώσεις θα πρέπει να έχετε αρκετή μνήμη για να διαβάσετε ολόκληρο το αρχείο, καθώς οι χαρακτήρες δεν καταλαμβάνουν πολύ χώρο, αλλά κουράζονται από μεγάλα αρχεία. Το παρακάτω παράδειγμα χρησιμοποιεί έναν συνδυασμό των with δήλωση, και το read() μέθοδος. Σε αυτή την περίπτωση, θα χρησιμοποιήσουμε read() για να φορτώσετε το περιεχόμενο του αρχείου ως ροή δεδομένων:

Ρίξτε μια ματιά στον πρακτικό μας οδηγό για την εκμάθηση του Git, με βέλτιστες πρακτικές, πρότυπα αποδεκτά από τον κλάδο και συμπεριλαμβανόμενο φύλλο εξαπάτησης. Σταματήστε τις εντολές του Git στο Google και πραγματικά μαθαίνουν το!


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.read()
    print (filecontent)

Η Python προσφέρει επίσης το readlines() μέθοδο, η οποία είναι παρόμοια με την readline() μέθοδο από το πρώτο παράδειγμα. Σε αντίθεση με read(), το περιεχόμενο του αρχείου αποθηκεύεται σε μια λίστα, όπου κάθε γραμμή του περιεχομένου είναι ένα στοιχείο:


filename = "test.txt"

with open(filename, 'r') as filehandle:
    filecontent = filehandle.readlines()
    for line in filecontent:
        print (line)

Ενώ readlines() θα διαβάζει περιεχόμενο από το αρχείο μέχρι να φτάσει στον ΕΟΦ, έχετε υπόψη σας ότι μπορείτε επίσης να περιορίσετε την ποσότητα του περιεχομένου που διαβάζεται παρέχοντας το sizehint παράμετρος, η οποία είναι ο αριθμός των byte προς ανάγνωση.

Συμπέρασμα

Ως συνήθως, υπάρχουν περισσότεροι από ένας τρόποι για να διαβάσετε τα περιεχόμενα ενός αρχείου. Όσον αφορά την ταχύτητα, όλοι τους είναι λίγο πολύ στην ίδια κατηγορία. Ποια λύση λειτουργεί καλύτερα για εσάς εξαρτάται από τη συγκεκριμένη περίπτωση χρήσης σας. Πιστεύουμε ότι είναι πολύ χρήσιμο να δούμε τι είναι δυνατό και στη συνέχεια να επιλέξουμε τη λύση που ταιριάζει καλύτερα.

Ενώ η Python απλοποιεί πολύ τη διαδικασία ανάγνωσης αρχείων, μπορεί να γίνει δύσκολη μερικές φορές, οπότε θα σας συνιστούσα να ρίξετε μια ματιά στο επίσημη τεκμηρίωση Python για περισσότερες πληροφορίες.

Σφραγίδα ώρας:

Περισσότερα από Stackabuse