Ποια βιβλιοθήκη Python μπορώ να χρησιμοποιήσω για να εξάγω ονόματα αρχείων από διαδρομές, ανεξάρτητα από το λειτουργικό σύστημα ή τη μορφή της διαδρομής;
Για παράδειγμα, θα ήθελα όλα αυτά τα μονοπάτια να μου επιστρέφουν το c
:
a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c
Η χρήση του os.path.split
ή του os.path.basename
όπως προτείνουν άλλοι δεν θα λειτουργήσει σε όλες τις περιπτώσεις: αν εκτελείτε το σενάριο σε Linux και προσπαθείτε να επεξεργαστείτε μια κλασική διαδρομή τύπου windows, θα αποτύχει.
Τα μονοπάτια των Windows μπορούν να χρησιμοποιήσουν είτε backslash είτε forward slash ως διαχωριστικό μονοπατιού. Επομένως, η ενότητα ntpath
(η οποία είναι ισοδύναμη με την os.path όταν εκτελείται σε windows) θα λειτουργήσει για όλα τα(1) μονοπάτια σε όλες τις πλατφόρμες.
import ntpath
ntpath.basename("a/b/c")
Φυσικά, αν το αρχείο τελειώνει με μια κάθετο, το βασικό όνομα θα είναι κενό, οπότε φτιάξτε τη δική σας συνάρτηση για να το αντιμετωπίσετε:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Επαλήθευση:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
<br>,
(1) Υπάρχει μια προειδοποίηση: τα ονόματα αρχείων Linux μπορούν να περιέχουν backslashes. Έτσι, στο linux, το r'a/b\c'
αναφέρεται πάντα στο αρχείο b\c
στο φάκελο a
, ενώ στα Windows, αναφέρεται πάντα στο αρχείο c
στον υποφάκελο b
του φακέλου a
. Έτσι, όταν σε μια διαδρομή χρησιμοποιούνται τόσο οι κάθετοι προς τα εμπρός όσο και προς τα πίσω, χρειάζεται να γνωρίζετε τη σχετική πλατφόρμα για να μπορέσετε να την ερμηνεύσετε σωστά. Στην πράξη είναι συνήθως ασφαλές να υποθέσουμε ότι πρόκειται για διαδρομή των windows, καθώς οι ανάποδες κάθετοι χρησιμοποιούνται σπάνια σε ονόματα αρχείων του Linux, αλλά να το έχετε αυτό κατά νου όταν γράφετε κώδικα, ώστε να μην δημιουργείτε κατά λάθος κενά ασφαλείας,
os.path.split είναι η συνάρτηση που ψάχνετε
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d
import os
head, tail = os.path.split(p)
print tail
Ας υποθέσουμε ότι p είναι η συμβολοσειρά εισόδου, η ουρά είναι αυτό που θέλετε.
Δείτε python os module docs για λεπτομέρειες