Ändern der Dateierweiterung in Python

74

Angenommen, index.pymit CGI habe ich eine Post-Datei foo.fasta, um die Datei anzuzeigen. Ich möchte die foo.fastaDateierweiterung so ändern , dass sie foo.alnin der Anzeigedatei angezeigt wird. Wie kann ich es tun?

MysticCodes
quelle

Antworten:

57

os.path.splitext(), os.rename()

zum Beispiel:

# renamee is the file getting renamed, pre is the part of file name before extension and ext is current extension
pre, ext = os.path.splitext(renamee)
os.rename(renamee, pre + new_extension)
Ignacio Vazquez-Abrams
quelle
Können Sie genauer sein, ich habe auch schon Dokumentation gesehen, aber es hat nicht funktioniert.
MysticCodes
Verwenden Sie die erste Funktion, um die Basis zu erhalten. Kombinieren Sie es mit der neuen Erweiterung und übergeben Sie den alten und den neuen Dateinamen an die zweite Funktion.
Ignacio Vazquez-Abrams
7
Korrektur: os.rename(root, root + new_extension)sollte lesenos.rename(renamee, root + new_extension)
Mloskot
5
Eigentlich ist es besser, diese Methode stattdessen für python3 zu verwenden: pathlib.path (pathtofile) .with_suffix (". mynewext"). Der mit pathlib.path (pathtofile) .stem vorgeschlagene Weg funktioniert, löscht jedoch den Pfad vor dem Basisnamen.
Bill Moore
3
str (pathlib.path (pathtofile) .with_suffix (". mynewext"))
Bill Moore
74

Ein eleganter Weg mit pathlib.Path :

from pathlib import Path
p = Path('mysequence.fasta')
p.rename(p.with_suffix('.aln'))
Nikita Malyavin
quelle
2
Obwohl das OP nicht um eine Umbenennung gebeten hat, befand es sich in den Tags. Wenn Sie eine Umbenennung durchführen möchten und die Eingabe möglicherweise einen Pfad und nicht nur einen Dateinamen hat, ist diese Technik die richtige .
Jason R. Coombs
6
In Bezug auf .with_suffix()die Eigenschaften .suffixund .suffixessollte Setter haben.
Polv
73
import os
thisFile = "mysequence.fasta"
base = os.path.splitext(thisFile)[0]
os.rename(thisFile, base + ".aln")

Wobei thisFile = der absolute Pfad der Datei ist, die Sie ändern

FryDay
quelle
6
Ich mag diese Antwort mehr, weil sie ein Beispiel liefert und nicht nur die Methoden nennt, die zur Erfüllung der Aufgabe erforderlich sind. Vielen Dank @FryDay
sadmicrowave
4
base, _ = os.path.splitext(thisFile)ist idiomatischer.
jpmc26
23

Ab Python 3.4 gibt es eine in pathlib integrierte Bibliothek. Der Code könnte also ungefähr so ​​aussehen:

from pathlib import Path

filename = "mysequence.fasta"
new_filename = Path(filename).stem + ".aln"

https://docs.python.org/3.4/library/pathlib.html#pathlib.PurePath.stem

Ich liebe Pathlib :)

AnaPana
quelle
3
Dies ist sogar noch besser mit Python 3.6 String Interpolation Syntax ( python.org/dev/peps/pep-0498 ) new_filename = f"{Path(filename).stem}.aln" 😎😎😎
Kishan B
2
Seien Sie vorsichtig - der Stiel streift auch den Pfad ab, wenn einer vorhanden ist. Wenn Sie die Datei umbenennen wollten und ein Pfad angegeben wurde (was zugegebenermaßen nicht in Frage kam), schlug diese Technik fehl.
Jason R. Coombs
5
Das Ergebnis ist auch eine Zeichenfolge, kein Pfadpfad mehr. p.parent / (p.stem + '.aln')wird dir einen neuen Weg geben.
Eric.Frederich
2
Warnung: Pfad (Dateiname) .stem löscht den Verzeichnisteil (Präfix) des Dateinamens.
user1741137
17

Benutze das:

os.path.splitext("name.fasta")[0]+".aln"

Und so funktioniert das oben Genannte:

Die Splitext-Methode trennt den Namen von der Erweiterung und erstellt ein Tupel:

os.path.splitext("name.fasta")

Das erstellte Tupel enthält jetzt die Zeichenfolgen "Name" und "Fasta". Dann müssen Sie nur auf die Zeichenfolge "name" zugreifen, die das erste Element des Tupels ist:

os.path.splitext("name.fasta")[0]

Und dann möchten Sie diesem Namen eine neue Erweiterung hinzufügen:

os.path.splitext("name.fasta")[0]+".aln"
multigoodverse
quelle
4

Wie AnaPana erwähnte, ist pathlib in Python 3.4 neuer und einfacher, und es gibt eine neue with_suffix-Methode, die dieses Problem leicht lösen kann:

from pathlib import Path
new_filename = Path(mysequence.fasta).with_suffix('.aln')
Mahdi Saravi
quelle
3

Pathlib verwenden und den vollständigen Pfad beibehalten:

from pathlib import Path
p = Path('/User/my/path')
new_p = Path(p.parent.as_posix() + '/' + p.stem + '.aln')
PollPenn
quelle
2
um es ein bisschen einfacher zu machennew_p = Path(p.with_suffix('').as_posix() + '.aln')
Jiho Noh
2

Leider habe ich einen Fall mit mehreren Punkten auf dem Dateinamen erlebt, bei dem Splittext nicht gut funktioniert hat ... meine Arbeit um:

file = r'C:\Docs\file.2020.1.1.xls'
ext = '.'+ os.path.realpath(file).split('.')[-1:][0]
filefinal = file.replace(ext,'.zip')
os.rename(file ,filefinal)
Hugo Vares
quelle
1
>> file = r'C:\Docs\file.2020.1.1.xls'
>> ext = '.'+ os.path.realpath(file).split('.')[-1:][0]
>> filefinal = file.replace(ext,'.zip')
>> os.rename(file ,filefinal) 

Schlechte Logik zum Wiederholen der Erweiterung, Beispiel: 'C: \ Docs \ .xls_aaa.xls.xls'

uDev
quelle