Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

7. Ανάγνωση & εγγραφή αρχείων, διαχείριση καταλόγων

ΤΜΧΠΠΑ-ΠΘ

Πριν ξεκινήσουμε την επίδειξη των εντολών για το σημερινό μάθημα, θα πρέπει να εισάγουμε μερικές απαραίτητες βιβλιοθήκες και να ορίσουμε τον τρέχοντα κατάλογο στη Python:

import os # για την εργασία με το σύστημα αρχείων
import pickle # για την αποθήκευση των δεδομένων σε αρχείο
from pathlib import Path # για την εργασία με διαδρομές αρχείων και φακέλων
from datetime import datetime, timezone # για την εργασία με ημερομηνίες και ώρες
import fnmatch # για την εργασία με μοτίβα ονομάτων αρχείων
#import tempfile # για την εργασία με προσωρινά αρχεία και φακέλους
from tempfile import TemporaryFile, TemporaryDirectory # για τη δημιουργία προσωρινών αρχείων και φακέλων
import shutil # για την εργασία με αρχεία και φακέλους, όπως αντιγραφή και μετακίνηση
print(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().

# ανοίγουμε το αρχείο για ανάγνωση
fo = open("foo.txt", "w") # Σημαντική παράμετρος το "w"
fo.write( "Ένα ταξίδι χιλίων χιλιομέτρων αρχίζει με ένα βήμα.\nΛάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος")
# κλείνουμε το αρχείο
fo.close()

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

# ανοίγουμε το αρχείο για ανάγνωση
fo = open("foo.txt", "r") # Σημαντική παράμετρος το "r για λειτουργία ανάγνωσης"

text = fo.read()
print (text)

# κλείνουμε το αρχείο
fo.close()
Ένα ταξίδι χιλίων χιλιομέτρων αρχίζει με ένα βήμα.
Λάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος

Επειδή υπάρχει ο κίνδυνος να ξεχάσουμε να καλέσουμε την μέθοδο close() σε ένα ανοικτό αρχείο, μπορούμε εναλλακτικά να ανοίξουμε ένα αρχείο με το with. Σε αυτήν την περίπτωση το αρχείο κλείνει αυτόματα όταν ολοκληρωθεί το μπλοκ εντολών εντός του with.

txt_file = open("foo.txt", "r")
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(20)
    print (text)


    text = fo.read()
    print (text)
Ένα τ
αξίδι χιλίων χιλιομέ
τρων αρχίζει με ένα βήμα.
Λάο Τσε, 6ος αιώνας π.Χ., Κινέζος φιλόσοφος

Με την χρήση της μεθόδου readlines() προσαρτούμε κάθε γραμμή που υπάρχει στο αρχείο σε μια λίστα. Όμως ο χαρακτήρας που ορίζει την νέα γραμμή (\n) δεν αγνοείται από την ανάγνωση. Γι’ αυτό τον λόγο καλούμε την μέθοδο rstrip() σε κάθε γραμμή η οποία αν κλήθεί χωρίς ορίσματα (συνήθως κάποιους χαρακτήρες) τότε αφαιρεί spaces, tabs και newlines.

with open('dog_breeds.txt', 'r') as reader:
    # Note: το readlines δεν αφαιρεί τα new line characters, οπότε κάθε στοιχείο της λίστας θα έχει ένα \n στο τέλος του
    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']
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']
list(reversed(dog_breeds))
['Beagle', 'Border Terrier', 'Boxer', 'West Highland White Terrier', 'Golden Retriever', 'Cavalier King Charles Spaniel', 'Staffordshire Bull Terrier', 'German Shepherd', 'English Springer Spaniel', 'Jack Russell Terrier', 'Pug']

Με την χρήση του with μπορούμε να εγγράψουμε δεδομένα κιόλας. Σημαντική παράμετρος το ‘w’ κατά το open() και η μέθοδος write().

with open('dog_breeds_reversed.txt', 'w') as writer:
    # εγγραφουμε τις φυλές των σκύλων σε αντίστροφη σειρά στο νέο αρχείο
    for breed in reversed(dog_breeds):
        writer.write(breed+'\n')

Με το όρισμα ‘a’ (append) κατά το άνοιγμα ενός αρχείου μπορούμε να εγγράψουμε σε ένα αρχείο χωρίς να διαγραφεί το προηγούμενο περιεχόμενο.

with open('dog_breeds.txt', 'a') as a_writer:
    a_writer.write('Volos\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
Volos

Μπορούμε να χρησιμοποιήσουμε παράλληλα δύο αρχεία με τις αντίστοιχες παραμέτρους ανάγνωσης, ή εγγραφής ή προσθήκης μέσω του 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:
    # ανάγνωση του αρχείου γραμμή-γραμμή
    line = reader.readline()
    while line != '':  # Το EOF char είναι μια κενή συμβολοσειρά
        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
Volos

Μπορούμε να διαβάσουμε γραμμή - γραμμή το περιεχόμενο ενός αρχείου μέσω ενός 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
Volos

Και για περισσότερο ευανάγνωστο κώδικα η Python μας δίνει την δυνατότητα να κάνουμε loop μέσω του reader object

with open('dog_breeds.txt', 'r') as reader:
    # αναγνωση του αρχείου γραμμή-γραμμή με for loop
    for line in reader:
        print(line, end='') # χρησιμοποιούμε το 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
Volos

Σειριοποίηση (pickle)

Στα προηγούμενα παραδείγματα διαβάσαμε ή γράψαμε συμβολοσειρές σε ένα αρχειο. Όμως, μέσω της σειριοποίησης μπορούμε να αποθηκεύσουμε σε ένα binary αρχείο τα αντικείμενα της python με τις ιδιότητές τους. Όχι μόνον σαν απλές συμβολοσειρές. Στο παρακάτω κομμάτι κώδικα θα αποθηκεύσουμε μία λίστα και μια μεταβλήτή σε ένα αρχείο με την βοήθεια της βιβλιοθήκης pickle.

mylist=['one', 2 , 'tree']
pi=3.14

mydic ={'mylist': mylist, 'pi': pi}
with open('pickle.txt',  'wb') as pickle_writer:
    pickle.dump(mydic, pickle_writer)

del mylist
del pi

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


with open('pickle.txt',  'rb') as pickle_read:
    mylist_restored = pickle.load(pickle_read)


Ανάκτηση περιεχομένων φακέλου

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

entries = os.scandir('./')
for entry in entries:
    print(entry.name)

data_03.txt
admin2_leo.py
file1.py
sub_dir2
data_03_backup.txt
pickle.txt
admin.py
sub_dir3
data_02.txt
data_02_backup.txt
data_05.txt
tests.py
dog_breeds_reversed.txt
tmp
data_01.txt
data_01_backup.txt
leo_1_backup.txt
sub_dir
dog_breeds.txt
foo.txt
# εναλλακτικά
os.listdir('./')
['data_03.txt', 'admin2_leo.py', 'file1.py', 'sub_dir2', 'data_03_backup.txt', 'pickle.txt', 'admin.py', 'sub_dir3', 'data_02.txt', 'data_02_backup.txt', 'data_05.txt', 'tests.py', 'dog_breeds_reversed.txt', 'tmp', 'data_01.txt', 'data_01_backup.txt', 'leo_1_backup.txt', 'sub_dir', 'dog_breeds.txt', 'foo.txt']
# Εναλλακτικά μέσω πρόταση with
with os.scandir('./') as entries:
    for entry in entries:
        print(entry.name)
data_03.txt
admin2_leo.py
file1.py
sub_dir2
data_03_backup.txt
pickle.txt
admin.py
sub_dir3
data_02.txt
data_02_backup.txt
data_05.txt
tests.py
dog_breeds_reversed.txt
tmp
data_01.txt
data_01_backup.txt
leo_1_backup.txt
sub_dir
dog_breeds.txt
foo.txt

To ίδιο μπορούμε να κάνουμε με την μέθοδο iterdir() σε ένα Path object από την βιβλιοθήκη pathlib

entries = Path('./')
for entry in entries.iterdir():
    print(entry.name) # εκτυπώνει το όνομα του αρχείου χωρίς την επέκταση
data_03.txt
admin2_leo.py
file1.py
sub_dir2
data_03_backup.txt
pickle.txt
admin.py
sub_dir3
data_02.txt
data_02_backup.txt
data_05.txt
tests.py
dog_breeds_reversed.txt
tmp
data_01.txt
data_01_backup.txt
leo_1_backup.txt
sub_dir
dog_breeds.txt
foo.txt

Η μέθοδος is_file() μας επιτρέπει να τεστάρουμε αν ένα αντικείμενο τύπου Path είναι αρχείο.

basepath = Path('./')
files_in_basepath = basepath.iterdir()
for item in files_in_basepath:
    if item.is_dir():
        print(item.name)
    else:
        print(f"{item.name} is not a directory.")
data_03.txt is not a directory.
admin2_leo.py is not a directory.
file1.py is not a directory.
sub_dir2
data_03_backup.txt is not a directory.
pickle.txt is not a directory.
admin.py is not a directory.
sub_dir3
data_02.txt is not a directory.
data_02_backup.txt is not a directory.
data_05.txt is not a directory.
tests.py is not a directory.
dog_breeds_reversed.txt is not a directory.
tmp
data_01.txt is not a directory.
data_01_backup.txt is not a directory.
leo_1_backup.txt is not a directory.
sub_dir
dog_breeds.txt is not a directory.
foo.txt is not a directory.

Επιπλέον για ένα 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_dir2
sub_dir3
tmp
sub_dir

Με την μέθοδο stat() μπορούμε να δούμε χρήσιμες λεπτομέρειες για ένα αρχείο και να ανακτήσουμε δεδομένα όπως το μέγεθος του, το όνομά του και η τελευταία ημερομηνία/ώρα τροποποίησης (δίνεται σε seconds απο την 1/1/1970)


current_dir = Path('.') #ορίστε έναν φάκελο. Στην συγκεκριμένη περίπτωση ορίζεται ο τρέχων κατάλογος.

for path in current_dir.iterdir():
    info = path.stat()

    type = 'File'
    if path.is_dir():
        type = 'Directory'
        
    
    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(f"\nΌνομα:{name}, Τύπος: {type}")
    print("\tΜέγεθος: ",size) # το μέγεθος του αρχείου σε bytes
    print("\tΗμερομηνία τελευταίας τροποποίησης", modification_time)

Όνομα:data_03.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:admin2_leo.py, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.353951+00:00

Όνομα:file1.py, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:sub_dir2, Τύπος: Directory
	Μέγεθος:  4096
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.356044+00:00

Όνομα:data_03_backup.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:pickle.txt, Τύπος: File
	Μέγεθος:  58
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:26:26.849078+00:00

Όνομα:admin.py, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.353951+00:00

Όνομα:sub_dir3, Τύπος: Directory
	Μέγεθος:  4096
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.356111+00:00

Όνομα:data_02.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:data_02_backup.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:data_05.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:tests.py, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.356111+00:00

Όνομα:dog_breeds_reversed.txt, Τύπος: File
	Μέγεθος:  202
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:26:26.663038+00:00

Όνομα:tmp, Τύπος: Directory
	Μέγεθος:  4096
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.356111+00:00

Όνομα:data_01.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:data_01_backup.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:leo_1_backup.txt, Τύπος: File
	Μέγεθος:  0
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355563+00:00

Όνομα:sub_dir, Τύπος: Directory
	Μέγεθος:  4096
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:24:57.355974+00:00

Όνομα:dog_breeds.txt, Τύπος: File
	Μέγεθος:  202
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:26:26.571235+00:00

Όνομα:foo.txt, Τύπος: File
	Μέγεθος:  168
	Ημερομηνία τελευταίας τροποποίησης 2026-06-11 15:26:26.104473+00:00

Μέσω του Path μπορούμε να φτιάξουμε και διαδρομές προς ένα κατάλογο του δίσκου μας όπως περιγράφεται παρακάτω:

Path.cwd()
PosixPath('/home/runner/work/programming/programming/notebooks/some_directory')
# δημιουργία paths 

# for i in range(1, 100):
#     path = Path.cwd() / f"city_{i}.shp"
#     print(path)

# # 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")

Δημιουργία καταλόγων

Στην παρακάτω ενότητα παρουσιάζεται η διαδικασία δημιουργίας νέων καταλόγων (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/test/larisa/maria') # δημιουργία καταλόγου 05 και όλων των γονικών (parent) καταλόγων
p.mkdir(parents=True,exist_ok=True) 

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

content = os.listdir('./')


print("Εύρεση αρχείων με καταληξη txt\n")

for file_name in content:
    if fnmatch.fnmatch(file_name, '*.txt'):
        print(file_name)
Εύρεση αρχείων με καταληξη txt

data_03.txt
data_03_backup.txt
pickle.txt
data_02.txt
data_02_backup.txt
data_05.txt
dog_breeds_reversed.txt
data_01.txt
data_01_backup.txt
leo_1_backup.txt
dog_breeds.txt
foo.txt

Εύρεση όλων των αρχείων στον τρέχοντα κατάλογο που το όνομά τους έχει την παρακάτω μορφή:

data_*_backup.txt

το αστεράκι (*) αντιπροσωπεύει οποιοδήποτε αριθμό χαρακτήρων μέσα στο όνομα.

for filename in os.listdir('./'):
    if fnmatch.fnmatch(filename, 'data_*_backup.xlsx'):
        print(filename)

Εναλλακτικά με την χρήση της μεθόδου 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
leo_1_backup.txt

Οι παραπάνω αναζητήσεις αφορούσαν το περιεχόμενο μόνο στον τρέχοντα κατάλογο και όχι ταυτόχρονα και στους υποκαταλόγους (child) που υπάρχουν μέσα σε αυτόν. Για να αναζητήσουμε διαδοχικά και σε αυτούς τους καταλόγους (recursively search), χρησιμοποιούμε το παρακάτω πρόθεμα πριν από το κριτήριο αναζήτησης: **/

p = Path('./')

for name in p.glob('**/*.py'):
    print(name)
admin2_leo.py
file1.py
admin.py
tests.py
sub_dir2/file1.py
sub_dir2/file2.py
sub_dir3/file1.py
sub_dir3/file2.py
sub_dir/file1.py
sub_dir/file2.py
# αναζήτηση για ότι περιέχει f και 1 στο filename

p = Path('.')
for name in p.glob('**/f*1*'):
    print(name)
file1.py
sub_dir2/file1.py
sub_dir3/file1.py
sub_dir/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=False):
    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: ./sub_dir2
		Found File: file1.py
		Found File: file2.py
Found directory: ./2018/10/05/test/larisa/maria
Found directory: ./2018/10/05/test/larisa
	Found subdirectory: maria
Found directory: ./2018/10/05/test
	Found subdirectory: larisa
Found directory: ./2018/10/05
	Found subdirectory: test
Found directory: ./2018/10
	Found subdirectory: 05
Found directory: ./2018
	Found subdirectory: 10
Found directory: ./sub_dir3
		Found File: file1.py
		Found File: file2.py
Found directory: ./example_directory
Found directory: ./tmp
		Found File: Text File.txt
Found directory: ./sub_dir
		Found File: file1.py
		Found File: file2.py
Found directory: .
	Found subdirectory: sub_dir2
	Found subdirectory: 2018
	Found subdirectory: sub_dir3
	Found subdirectory: example_directory
	Found subdirectory: tmp
	Found subdirectory: sub_dir
		Found File: data_03.txt
		Found File: admin2_leo.py
		Found File: file1.py
		Found File: data_03_backup.txt
		Found File: pickle.txt
		Found File: admin.py
		Found File: data_02.txt
		Found File: data_02_backup.txt
		Found File: data_05.txt
		Found File: tests.py
		Found File: dog_breeds_reversed.txt
		Found File: data_01.txt
		Found File: data_01_backup.txt
		Found File: leo_1_backup.txt
		Found File: dog_breeds.txt
		Found File: foo.txt

Προσωρινά αρχεία και κατάλογοι

Με την python μπορούμε να δημιουργήσουμε προσωρινά αρχεία και καταλόγους τα οποία παύουν να υπάρχουν μετά την εκτέλεση του κώδικα. Αυτό γίνεται με την βοήθεια του αρθρώματος (module) tempfile και της συνάρτησης TemporaryFile() και TemporaryDirectory(). Οι λειτουργίες αυτές είναι χρήσιμες όταν τα objects που δημιουργούνται δεν επαρκούν στην μνήμη ή για λόγους ασφαλείας όταν δεν θέλουμε να αφήσουμε εγγεγραμένα αρχείο στο σύστημα αρχείων του υπολογιστή.

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))
Created temporary directory  /tmp/tmpacynkm0_
/tmp/tmpacynkm0_
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.

# πρώτα δημιουργούμε ένα directory
my_dir = Path('./tmp')
my_dir.mkdir(exist_ok=True)
print(f'Δημιουργία καταλόγου: {my_dir.absolute()}')

# μετά διαγράφουμε το directory
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 υπάρχει και θα διαγραφεί
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
Cell In[46], line 9
      7 if my_dir.is_dir():
      8     print (f"Το directory {my_dir} υπάρχει και θα διαγραφεί")
----> 9     my_dir.rmdir()
     10 else:
     11     print ("Το directory δεν υπάρχει")

File /opt/hostedtoolcache/Python/3.11.6/x64/lib/python3.11/pathlib.py:1156, in Path.rmdir(self)
   1152 def rmdir(self):
   1153     """
   1154     Remove this directory.  The directory must be empty.
   1155     """
-> 1156     os.rmdir(self)

OSError: [Errno 39] Directory not empty: '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)

Αντιγραφή αρχείων και φακέλων

Ταυτόχρονα μπορούμε να αντιγράψουμε αρχεία με την συνάρτηση copy() πάλι από το άρθρωμα shutil.

# Αντιγραφή αρχείου

src = 'admin.py'
dst = 'admin2_leo.py'
shutil.copy(src, dst)

ή ολόκληρους καταλόγους μέσω της συνάρτησης 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")
# μετακίνηση αρχείου και μάλιστα με μετονομασία κατά την μετακίνηση data_04.txt -> data_05.txt

try:
    shutil.move('sub_dir/data_04.txt', 'data_05.txt' )
except FileNotFoundError:
    print("File does not exist")
# μετακίνηση φακέλου

try:
    shutil.move('tmp2', 'tmp/tmp2') 
except FileNotFoundError:
    print("Directory does not exist")
# επιστροφή στην θέση του 
try:
    shutil.move('tmp/tmp2','tmp2')
except FileNotFoundError:
    print("Directory does not exist")

Μετονομασία

Με την χρήση της μεθόδου rename() μπορούμε να μετονομάσουμε ένα Path object.

# αρχείου
data_file = Path('data_01.txt')
data_file.rename('data.txt')
# ξανά όπως ήταν
data_file = Path('data.txt')
data_file.rename('data_01.txt')

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