Πριν ξεκινήσουμε την επίδειξη των εντολών για το σημερινό μάθημα, θα πρέπει να εισάγουμε μερικές απαραίτητες βιβλιοθήκες και να ορίσουμε τον τρέχοντα κατάλογο στη 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')Βιβλιογραφία¶
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