Πριν ξεκινήσουμε την επίδειξη των εντολών για το σημερινό μάθημα, θα πρέπει να εισάγουμε μερικές απαραίτητες βιβλιοθήκες και να ορίσουμε τον τρέχων κατάλογο στη Python:
import os
import pickle
from pathlib import Path
from datetime import datetime, timezone
import fnmatch
import tempfile
from tempfile import TemporaryFile, TemporaryDirectory
import shutilprint(os.getcwd()) # εκτύπωση τρέχοντος καταλόγου στην Python
path="./some_directory/"
os.chdir(path) # ορισμός τρέχοντος καταλόγου
print(os.getcwd()) # επιβεβαίωση του τρέχοντος καταλόγου στην Python
/home/runner/work/programming/programming/notebooks
/home/runner/work/programming/programming/notebooks/some_directory
Ανάγνωση & εγγραφή αρχείων¶
Μπορούμε να ανοίξουμε ένα αρχείο με την μέθοδο open, να δούμε μερικές ιδιότητες του και να το κλείσουμε
myfile=open("foo.txt", "r")
print ("Name of the file: ", myfile.name)
print ("Closed or not : ", myfile.closed)
print ("Opening mode : ", myfile.mode)
myfile.close()
print(myfile.closed)Name of the file: foo.txt
Closed or not : False
Opening mode : r
True
Με την μέθοδο write() σε ένα object ανοικτού αρχείου (TextIOWrapper object πιο συγκεκριμένα) μπορούμε να γράψουμε σε αυτό περιεχόμενο. Κατά το open δίνουμε σαν παράμετρους το όνομα του αρχείου και την επιλογή προσπέλασης “w” (όπου w= εγγραφή, r= ανάγνωση, a=προσθήκη). Το w μας επιτρέπει την δυνατότητα εγγραφής. Πάντα πρέπει να κλείνουμε το ανοικτό αρχείο με την μέθοδο close().
# Open a file
fo = open("foo.txt", "w") # Σημαντική παράμετρος το "w"
fo.write( "Ένα ταξίδι χιλίων χιλιομέτρων αρχίζει με ένα βήμα.\nΛάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος")
# Close opend file
fo.close()Επιβεβαιώνουμε ότι όντως έγινε η εγγραφή ξαναδιαβάζοντας το αρχείο με την μέθοδο read() η οποία διαβάζει το συνολικό περιεχόμενο από το αρχείο.
# Open a file
fo = open("foo.txt", "r") # Σημαντική παράμετρος το "r για λειτουργία ανάγνωσης"
text = fo.read()
print (text)
# Close opened file
fo.close()Ένα ταξίδι χιλίων χιλιομέτρων αρχίζει με ένα βήμα.
Λάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος
Επειδή υπάρχει ο κίνδυνος να ξεχάσουμε να καλέσουμε την μέθοδο close() σε ένα ανοικτό αρχείο, μπορούμε εναλλακτικά να ανοίξουμε ένα αρχείο με το with. Σε αυτήν την περίπτωση το αρχείο κλείνει αυτόματα όταν ολοκληρωθεί το μπλοκ εντολών εντός του with.
with open('foo.txt', 'r') as reader:
print(reader.read())Ένα ταξίδι χιλίων χιλιομέτρων αρχίζει με ένα βήμα.
Λάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος
Η μέθοδος read() δέχεται σαν όρισμα τον αριθμό των bytes που θα επιστρέψει.
with open('foo.txt', 'r') as fo:
text = fo.read(5)
print (text)
text = fo.read(10)
print (text)Ένα τ
αξίδι χιλί
Με την χρήση της μεθόδου readlines() προσαρτούμε κάθε γραμμή που υπάρχει στο αρχείο σε μια λίστα. Όμως ο χαρακτήρας που ορίζει την νέα γραμμή (\n) δεν αγνοείται από την ανάγνωση. Γι’ αυτό τον λόγο καλούμε την μέθοδο rstrip() σε κάθε γραμμή η οποία αν κλήθεί χωρίς ορίσματα (συνήθως κάποιους χαρακτήρες) τότε αφαιρεί spaces, tabs και newlines.
with open('dog_breeds.txt', 'r') as reader:
# Note: readlines doesn't trim the line endings
dog_breeds = reader.readlines()
dog_breeds = [line.rstrip() for line in dog_breeds] # μπορούμε να αφαιρέσουμ τα new line characters με αυτόν τον τρόπο
print(dog_breeds)['Pug', 'Jack Russell Terrier', 'English Springer Spaniel', 'German Shepherd', 'Staffordshire Bull Terrier', 'Cavalier King Charles Spaniel', 'Golden Retriever', 'West Highland White Terrier', 'Boxer', 'Border Terrier', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle', 'Beagle']
Με την χρήση του with μπορούμε να εγγράψουμε δεδομένα κιόλας. Σημαντική παράμετρος το ‘w’ κατά το open() και η μέθοδος write().
with open('dog_breeds_reversed.txt', 'w') as writer:
# Write the dog breeds to the file in reversed order
for breed in reversed(dog_breeds):
writer.write(breed)Με το όρισμα ‘a’ (append) κατά το άνοιγμα ενός αρχείου μπορούμε να εγγράψουμε σε ένα αρχείο χωρίς να διαγραφεί το προηγούμενο περιεχόμενο.
with open('dog_breeds.txt', 'a') as a_writer:
a_writer.write('Beagle\n')with open('dog_breeds.txt', 'r') as reader:
print(reader.read())Pug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Μπορούμε να χρησιμοποιήσουμε παράλληλα δύο αρχεία με τις αντίστοιχες παραμέτρους ανάγνωσης, ή εγγραφής ή προσθήκης μέσω του with ως εξής:
d_path = 'dog_breeds.txt'
d_r_path = 'dog_breeds_reversed.txt'
with open(d_path, 'r') as reader, open(d_r_path, 'w') as writer:
dog_breeds = reader.readlines()
writer.writelines(reversed(dog_breeds))Επιπλέον υπάρχει η δυνατότητα ανάγνωσης αρχείου ανά γραμμή μέσω βρόγχου while και της μεθόδου readline():
with open('dog_breeds.txt', 'r') as reader:
# Read and print the entire file line by line
line = reader.readline()
while line != '': # The EOF char is an empty string
print(line, end='')
line = reader.readline()Pug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Μπορούμε να διαβάσουμε γραμμή - γραμμή το περιεχόμενο ενός αρχείου μέσω ενός loop στην λίστα γραμμών που μας προσφέρει η μέθοδος readlines()
with open('dog_breeds.txt', 'r') as reader:
for line in reader.readlines():
print(line, end='')Pug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Και για περισσότερο ευανάγνωστο κώδικα η Python μας δίνει την δυνατότητα να κάνουμε loop μέσω του reader object
with open('dog_breeds.txt', 'r') as reader:
# Read and print the entire file line by line
for line in reader:
print(line, end='') # use end='' το avoid new line after each print statementPug
Jack Russell Terrier
English Springer Spaniel
German Shepherd
Staffordshire Bull Terrier
Cavalier King Charles Spaniel
Golden Retriever
West Highland White Terrier
Boxer
Border Terrier
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Beagle
Σειριοποίηση (pickle)¶
Στα προηγούμενα παραδείγματα διαβάσαμε ή γράψαμε συμβολοσειρές σε ένα αρχειο. Όμως, μέσω της σειριοποίησης μπορούμε να αποθηκεύσουμε σε ένα binary αρχείο τα αντικείμενα της python με τις ιδιότητές τους. Όχι μόνον σαν απλές συμβολοσειρές. Στο παρακάτω κομμάτι κώδικα θα αποθηκεύσουμε μία λίστα και μια μεταβλήτή σε ένα αρχείο με την βοήθεια της βιβλιοθήκης pickle.
mylist=['one', 2 , 'tree']
pi=3.14
with open('pickle.txt', 'ab') as pickle_writer:
pickle.dump(mylist, pickle_writer)
pickle.dump(pi, pickle_writer)
Αφού έχουμε αποθηκεύσει τα σχετικά object σε ένα αρχείο, μπορούμε σε μεταγενέστερα στάδια του κώδικα να τα ανακαλέσουμε αυτούσια μέσω της ανάγνωσης αυτού του αρχείου.
with open('pickle.txt', 'rb') as pickle_read:
pickle.load(pickle_read)
print(pi)
print(mylist)3.14
['one', 2, 'tree']
Ανάκτηση περιεχομένων φακέλου¶
Μέσω της μεθόδου os.scandir() μπορούμε να λάβουμε μια λίστα με τα αρχεία και τους φακέλους σε ένα κατάλογο.
entries = os.scandir('./')
for entry in entries:
print(entry.name)
data_03_backup.txt
dog_breeds.txt
admin.py
sub_dir
tests.py
admin2.py
data_01.txt
pickle.txt
data_03.txt
dog_breeds_reversed.txt
data_02.txt
file1.py
data_02_backup.txt
sub_dir3
sub_dir2
foo.txt
data_01_backup.txt
# εναλλακτικά
os.listdir('./')['data_03_backup.txt',
'dog_breeds.txt',
'admin.py',
'sub_dir',
'tests.py',
'admin2.py',
'data_01.txt',
'pickle.txt',
'data_03.txt',
'dog_breeds_reversed.txt',
'data_02.txt',
'file1.py',
'data_02_backup.txt',
'sub_dir3',
'sub_dir2',
'foo.txt',
'data_01_backup.txt']# Εναλλακτικά μέσω πρόταση with
with os.scandir('./') as entries:
for entry in entries:
print(entry.name)
data_03_backup.txt
dog_breeds.txt
admin.py
sub_dir
tests.py
admin2.py
data_01.txt
pickle.txt
data_03.txt
dog_breeds_reversed.txt
data_02.txt
file1.py
data_02_backup.txt
sub_dir3
sub_dir2
foo.txt
data_01_backup.txt
To ίδιο μπορούμε να κάνουμε με την μέθοδο iterdir() σε ένα Path object από την βιβλιοθήκη pathlib
entries = Path('./')
for entry in entries.iterdir():
print(entry.name)data_03_backup.txt
dog_breeds.txt
admin.py
sub_dir
tests.py
admin2.py
data_01.txt
pickle.txt
data_03.txt
dog_breeds_reversed.txt
data_02.txt
file1.py
data_02_backup.txt
sub_dir3
sub_dir2
foo.txt
data_01_backup.txt
Η μέθοδος is_file() μας επιτρέπει να τεστάρουμε αν ένα αντικείμενο τύπου Path είναι αρχείο.
basepath = Path('./')
files_in_basepath = basepath.iterdir()
for item in files_in_basepath:
if item.is_file():
print(item.name)data_03_backup.txt
dog_breeds.txt
admin.py
tests.py
admin2.py
data_01.txt
pickle.txt
data_03.txt
dog_breeds_reversed.txt
data_02.txt
file1.py
data_02_backup.txt
foo.txt
data_01_backup.txt
Επιπλέον για ένα path μπορούμε να λάβουμε την απόλυτη μορφή του (absolute path) μέσω της συνάρτησης os.path.abspath()
τον κατάλογο στον οποίο βρίσκεται (μέσω της συνάρτησης dirname()) και το όνομα του αρχείου (με os.path.basename())
path="./foo.txt" # relative path
abspath = os.path.abspath(path) # absolute path
print(abspath)
print(os.path.dirname(abspath)) # όνομα καταλόγου που βρίσκεται το αρχείο
print(os.path.basename(abspath)) # όνομα αρχείου (filename)/home/runner/work/programming/programming/notebooks/some_directory/foo.txt
/home/runner/work/programming/programming/notebooks/some_directory
foo.txt
Η μέθοδος is_dir() μας επιτρέπει να τεστάρουμε αν ένα αντικείμενο τύπου Path είναι φάκελος (directory).
# List all subdirectory using pathlib
basepath = Path('.')
for entry in basepath.iterdir():
if entry.is_dir():
print(entry.name)sub_dir
sub_dir3
sub_dir2
Με την μέθοδο stat() μπορούμε να δούμε χρήσιμες λεπτομέρειες για ένα αρχείο και να ανακτήσουμε δεδομένα όπως το μέγεθος του, το όνομά του και η τελευταία ημερομηνία/ώρα τροποποίησης (δίνεται σε seconds απο την 1/1/1970)
current_dir = Path('./') #ορίστε έναν φάκελο. Στην συγκεκριμένη περίπτωση ορίζεται ο τρέχων κατάλογος.
for path in current_dir.iterdir():
info = path.stat()
size=info.st_size
modification_time=datetime.fromtimestamp(info.st_mtime, tz=timezone.utc) # st_time= the number of seconds passed since 1st January 1970 (epoch)
name=path.name
print("\nΌνομα αρχείου:", name)
print("\tΜέγεθος: ",size) # το μέγεθος του αρχείου σε bytes
print("\tΗμερομηνία τελευταίας τροποποίησης", modification_time)
Όνομα αρχείου: data_03_backup.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: dog_breeds.txt
Μέγεθος: 917
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:51:51.858203+00:00
Όνομα αρχείου: admin.py
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.864570+00:00
Όνομα αρχείου: sub_dir
Μέγεθος: 4096
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.867082+00:00
Όνομα αρχείου: tests.py
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.867332+00:00
Όνομα αρχείου: admin2.py
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.864570+00:00
Όνομα αρχείου: data_01.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: pickle.txt
Μέγεθος: 5544
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:51:52.131202+00:00
Όνομα αρχείου: data_03.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: dog_breeds_reversed.txt
Μέγεθος: 917
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:51:51.952027+00:00
Όνομα αρχείου: data_02.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: file1.py
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: data_02_backup.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Όνομα αρχείου: sub_dir3
Μέγεθος: 4096
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.867332+00:00
Όνομα αρχείου: sub_dir2
Μέγεθος: 4096
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.867210+00:00
Όνομα αρχείου: foo.txt
Μέγεθος: 168
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:51:51.533642+00:00
Όνομα αρχείου: data_01_backup.txt
Μέγεθος: 0
Ημερομηνία τελευταίας τροποποίησης 2026-04-02 07:49:37.866407+00:00
Μέσω του Path μπορούμε να φτιάξουμε και διαδρομές προς ένα κατάλογο του δίσκου μας όπως περιγράφεται παρακάτω:
# δημιουργία paths
in_file_1 = Path.cwd() / "in" / "input.xlsx"
out_file_1 = Path.cwd() / "out" / "output.xlsx"
print(in_file_1)
print(out_file_1)
# ή
in_file_2 = Path.cwd().joinpath("in").joinpath("input.xlsx")
out_file_2 = Path.cwd().joinpath("out").joinpath("output.xlsx")
/home/runner/work/programming/programming/notebooks/some_directory/in/input.xlsx
/home/runner/work/programming/programming/notebooks/some_directory/out/output.xlsx
Δημιουργία καταλόγων¶
Στην παρακάτω ενότητα παρουσιάζεται η διαδικασία δημιουργίας νέων καταλόγων (directories) στο σύστημα αρχείων του υπολογιστή μας.
Πριν ξεκινήσουμε, επιβεβαιώνουμε για μια ακόμη φορά τον τρέχοντα κατάλογο
path = Path.cwd() # pathlib object, εναλλακτικό του os.getcwd()
print(str(path)) # print σαν συμβολοσειρά
/home/runner/work/programming/programming/notebooks/some_directory
Μπορούμε να δημιουργήσουμε καταλόγους με την μέθοδο mkdir()
# create directory
try:
p = Path('example_directory/') # ορισμός absolute ή relative Path
p.mkdir() # δημιουργία καταλόγου
except FileExistsError:
print(f"Ο κατάλογος {str(p)} υπάρχει ήδη")Μπορούμε να καλέσουμε την mkdir() με την παράμετρο exist_ok=True, ώστε να αγνοείται η δημιουργία του αν αυτός υπάρχει ήδη.
p.mkdir(exist_ok=True)Επιπλέον κατά την δημιουργία ενός καταλόγου είναι εφικτό να δημιουργήσουμε όλους τους γονικούς (parent) καταλόγους αν αυτοί δεν υπάρχουν ήδη μέσω της παραμέτρου parents=True.
p = Path('2018/10/05') # δημιουργία καταλόγου 05 και όλων των γονικών (parent) καταλόγων
p.mkdir(parents=True,exist_ok=True) Ακόμα μπορούμε να αναζητήσουμε αρχεία και καταλόγους που περιλαμβάνουν συγκεκριμένους χαρακτήρες στο ονομά τους
content = os.listdir('./')
print(content)
print("Εύρεση αρχείων με καταληξη txt\n")
for file_name in content:
if fnmatch.fnmatch(file_name, '*.txt'):
print(file_name)
['data_03_backup.txt', 'dog_breeds.txt', 'admin.py', 'sub_dir', 'tests.py', 'admin2.py', 'data_01.txt', '2018', 'pickle.txt', 'data_03.txt', 'example_directory', 'dog_breeds_reversed.txt', 'data_02.txt', 'file1.py', 'data_02_backup.txt', 'sub_dir3', 'sub_dir2', 'foo.txt', 'data_01_backup.txt']
Εύρεση αρχείων με καταληξη txt
data_03_backup.txt
dog_breeds.txt
data_01.txt
pickle.txt
data_03.txt
dog_breeds_reversed.txt
data_02.txt
data_02_backup.txt
foo.txt
data_01_backup.txt
Εύρεση όλων των αρχείων στον τρέχοντα κατάλογο που το όνομά τους έχει την παρακάτω μορφή:
data_*_backup.txtτο αστεράκι (*) αντιπροσωπεύει οποιοδήποτε αριθμό χαρακτήρων μέσα στο όνομα.
for filename in os.listdir('./'):
if fnmatch.fnmatch(filename, 'data_*_backup.txt'):
print(filename)data_03_backup.txt
data_02_backup.txt
data_01_backup.txt
Εναλλακτικά με την χρήση της μεθόδου glob():
p = Path('.')
for name in p.glob('data_*_backup.txt'):
print(name)data_03_backup.txt
data_02_backup.txt
data_01_backup.txt
p = Path('.')
for name in p.glob('*[0-9]*backup.txt'):
print(name)data_03_backup.txt
data_02_backup.txt
data_01_backup.txt
Οι παραπάνω αναζητήσεις αφορούσαν το περιεχόμενο μόνο στον τρέχοντα κατάλογο και όχι ταυτόχρονα και στους υποκαταλόγους (child) που υπάρχουν μέσα σε αυτόν. Για να αναζητήσουμε διαδοχικά και σε αυτούς τους καταλόγους (recursively search), χρησιμοποιούμε το παρακάτω πρόθεμα πριν από το κριτήριο αναζήτησης: **/
p = Path('.')
print(f'Τρέχων κατάλογος: {p.cwd()}\n\n{"*"*70}\n')
for name in p.glob('**/*.py'):
print(name)Τρέχων κατάλογος: /home/runner/work/programming/programming/notebooks/some_directory
**********************************************************************
admin.py
tests.py
admin2.py
file1.py
sub_dir/file2.py
sub_dir/file1.py
sub_dir3/file2.py
sub_dir3/file1.py
sub_dir2/file2.py
sub_dir2/file1.py
# αναζήτηση για ότι περιέχει f και 1 στο filename
p = Path('.')
for name in p.glob('**/f*1*'):
print(name)file1.py
sub_dir/file1.py
sub_dir3/file1.py
sub_dir2/file1.py
Για να ανατρέξουμε διαδοχικά σε όλους του φακέλους ενός καταλόγου χρησιμοποιούμε την μέθοδo os.walk
# walk
# Walking a directory tree and printing the names of the directories and files
for dirpath, dirnames, files in os.walk('.', topdown=True):
print(f'Found directory: {dirpath}')
for dirname in dirnames:
print(f'\tFound subdirectory:',dirname)
for file_name in files:
print(f'\t\tFound File:',file_name)
Found directory: .
Found subdirectory: sub_dir
Found subdirectory: 2018
Found subdirectory: example_directory
Found subdirectory: sub_dir3
Found subdirectory: sub_dir2
Found File: data_03_backup.txt
Found File: dog_breeds.txt
Found File: admin.py
Found File: tests.py
Found File: admin2.py
Found File: data_01.txt
Found File: pickle.txt
Found File: data_03.txt
Found File: dog_breeds_reversed.txt
Found File: data_02.txt
Found File: file1.py
Found File: data_02_backup.txt
Found File: foo.txt
Found File: data_01_backup.txt
Found directory: ./sub_dir
Found File: file2.py
Found File: file1.py
Found directory: ./2018
Found subdirectory: 10
Found directory: ./2018/10
Found subdirectory: 05
Found directory: ./2018/10/05
Found directory: ./example_directory
Found directory: ./sub_dir3
Found File: file2.py
Found File: file1.py
Found directory: ./sub_dir2
Found File: file2.py
Found File: file1.py
Προσωρινά αρχεία και κατάλογοι¶
Με την python μπορούμε να δημιουργήσουμε προσωρινά αρχεία και καταλόγους τα οποία παύουν να υπάρχουν μετά την εκτέλεση του κώδικα. Αυτό γίνεται με την βοήθεια του αρθρώματος (module) tempfile και της συνάρτησης TemporaryFile() και TemporaryDirectory(). Η λειτουργίες αυτές είναι χρήσιμες όταν τα object που δημιουργούνται δεν επαρκούν στην μνήμη ή για λόγους ασφαλείας όταν δεν θέλουμε να αφήσουμε εγγεγραμένα αρχείο στο σύστημα αρχείων του υπολογιστή.
from tempfile import TemporaryFile
# temporary files
with TemporaryFile('w+t') as fp: # άνοιγμα προσωρινού αρχείου για εγγραφή
fp.write('Hello universe!')
fp.seek(0)
print(fp.read())
Hello universe!
Αφού εκτελεστεί το block κώδικα εντός του with τότε το αρχείο διαγράφεται αυτόματα.
with TemporaryDirectory() as tmpdir:
print('Created temporary directory ', tmpdir)
print(tmpdir)
print(os.path.exists(tmpdir))
# Directory contents have been removed
Created temporary directory /tmp/tmplcl6iy86
/tmp/tmplcl6iy86
True
Αφού έχουμε εξέλθει από τον block κώδικα with το προσωρινό directory παύει να υπάρχει:
os.path.exists(tmpdir)FalseΔιαγραφή αρχείων και φακέλων¶
Με την μέθοδο unlink() σε ένα Path object μπορούμε να διαγράψουμε ένα αρχείο.
data_file = Path('./data_04.txt')
if data_file.is_file():
print (f"Το αρχείο {data_file.name} υπάρχει και θα διαγραφεί")
data_file.unlink()
else:
print ("Το αρχείο δεν υπάρχει")
Το αρχείο δεν υπάρχει
Για την διαγραφή άδειου φακέλου καλούμε την μέθοδο rmdir() στο Path object.
# First create an empty dir
my_dir = Path('./tmp')
my_dir.mkdir(exist_ok=True)
print(f'Δημιουργία καταλόγου: {my_dir.absolute()}')
# Then delete it
if my_dir.is_dir():
print (f"Το directory {my_dir} υπάρχει και θα διαγραφεί")
my_dir.rmdir()
else:
print ("Το directory δεν υπάρχει")
Δημιουργία καταλόγου: /home/runner/work/programming/programming/notebooks/some_directory/tmp
Το directory tmp υπάρχει και θα διαγραφεί
Αν θέλουμε να διαγράψουμε έναν κατάλογο ο οποίος περιλαμβάνει και περιεχόμενα τότε χρησιμοποιούμε η συνάρτηση rmtree() από την βιβλιοθήκη shutil.
# First create an empty dir
my_dir = Path('./tmp2')
my_dir.mkdir(exist_ok=True)
print(f'Δημιουργία καταλόγου: \n\t{my_dir.absolute()}\n')
# Δημιουργία άδειων αρχείων
for i in range(0,5):
file_empty = my_dir / f"empty_file{i}.txt"
file_empty.touch(exist_ok=True)
print(f'\tΔημιουργία αρχείου:', file_empty)
# διαγραφή φακέλου με περιεχόμενα
print(f'Διαγραφή καταλόγου: \n\t{my_dir.absolute()}\n')
shutil.rmtree(my_dir, ignore_errors=True)Δημιουργία καταλόγου:
/home/runner/work/programming/programming/notebooks/some_directory/tmp2
Δημιουργία αρχείου: tmp2/empty_file0.txt
Δημιουργία αρχείου: tmp2/empty_file1.txt
Δημιουργία αρχείου: tmp2/empty_file2.txt
Δημιουργία αρχείου: tmp2/empty_file3.txt
Δημιουργία αρχείου: tmp2/empty_file4.txt
Διαγραφή καταλόγου:
/home/runner/work/programming/programming/notebooks/some_directory/tmp2
Αντιγραφή αρχείων και φακέλων¶
Ταυτόχρονα μπορούμε να αντιγράψουμε αρχεία με την συνάρτηση copy() πάλι από το άρθρωμα shutil.
# Αντιγραφή αρχείου
src = 'admin.py'
dst = 'admin2.py'
shutil.copy(src, dst)'admin2.py'ή ολόκληρους καταλόγους μέσω της συνάρτησης copytree() πάλι από το ίδιο άρθρωμα.
try:
shutil.copytree('sub_dir', 'sub_dir3')
except FileExistsError:
print("Ο φάκελος υπάρχει ήδη")Ο φάκελος υπάρχει ήδη
Μετακίνηση¶
ή ακόμα και να μετακινήσουμε αρχεία και καταλόγους με την συναρτηση move()
try:
shutil.move('data_04.txt', 'sub_dir/data_04.txt')
except FileNotFoundError:
print("File does not exist")File does not exist
# μετακίνηση αρχείου και μάλιστα με μετονομασία κατά την μετακίνηση data_04.txt -> data_05.txt
try:
shutil.move('sub_dir/data_04.txt', 'data_05.txt' )
except FileNotFoundError:
print("File does not exist")File does not exist
# μετακίνηση φακέλου
try:
shutil.move('tmp2', 'tmp/tmp2')
except FileNotFoundError:
print("Directory does not exist")Directory does not exist
# επιστροφή στην θέση του
try:
shutil.move('tmp/tmp2','tmp2')
except FileNotFoundError:
print("Directory does not exist")Directory does not exist
Μετονομασία¶
Με την χρήση της μεθόδου rename() μπορούμε να μετονομάσουμε ένα Path object.
# αρχείου
data_file = Path('data_01.txt')
data_file.rename('data.txt')PosixPath('data.txt')# ξανά όπως ήταν
data_file = Path('data.txt')
data_file.rename('data_01.txt')PosixPath('data_01.txt')Βιβλιογραφία¶
Aγγελιδάκης, Ν., 2015. Εισαγωγή στον προγραμματισμό με την Python. Αγγελιδάκης, Ηράκλειο.
Working With Files in Python, https://
realpython .com /read -write -files -python/, Πρόσβαση: 13/05/2022 Reading and Writing Files in Python, https://
realpython .com /read -write -files -python, Πρόσβαση: 13/05/2022