Ä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?

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)

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'))

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


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 :)


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"

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')

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')

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)

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'

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.