So benennen Sie eine Datei mit Python um

359

Ich möchte ändern a.txtzu b.kml.

zjm1126
quelle

Antworten:

578

Verwendung os.rename:

import os

os.rename('a.txt', 'b.kml')
DU
quelle
52
Wenn sich die Dateien nicht im Arbeitsverzeichnis befinden, benötigen Sie den vollständigen Pfad.
EndermanAPM
Nicht wirklich, auf 3.7 Ubuntu, funktioniert für mich mit relativen Pfaden
toing_toing
2
@toing_toing natürlich funktioniert es, er meint wahrscheinlich nur, dass Sie das aktuelle Verzeichnis kennen und entweder den Pfad relativ dazu angeben oder einfach den absoluten Pfad verwenden sollten (wie C:/folder/file.txtunter Windows oder /home/file.txtunter Linux / MacOS).
Alex P.
Es ist erwähnenswert, dass dies Dateien auf Unix-ähnlichen Systemen stillschweigend überschreibt, OSErrorauf Windows -Systemen jedoch fehlschlägt . os.path.existssollte verwendet werden, um vor dem Umbenennen zu überprüfen, ob das Ziel vorhanden ist. Dies führt zwar zu einem Fehler "Time Of Check to Time Of Use", es ist jedoch unwahrscheinlich, dass Probleme auftreten. (Ich kenne keinen einfachen Weg, um das zu
umgehen
2
Wenn der Benutzer tatsächlich möchte, dass die Datei unter einem Betriebssystem ersetzt wird, sollte manos.replace
LucG
73

Die Datei befindet sich möglicherweise in einem Verzeichnis. Geben Sie in diesem Fall den Pfad an:

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)
Abdul Razak
quelle
49
import shutil

shutil.move('a.txt', 'b.kml')

Dies funktioniert, um eine Datei umzubenennen oder zu verschieben.

Andy Bileam
quelle
32
shutil.moveist keine gute Option, da es sich nicht um eine atomare Operation handelt. Wenn die Datei geöffnet ist, shutil.movewird beispielsweise eine Datei mit erstellt new_name, die Datei jedoch nicht gelöscht, old_namesodass Sie zwei Dateien erhalten. os.renameauf der anderen Seite wird nichts tun, was eine bessere Option ist . Mit shutil.move, auch wenn Sie den Fehler erwischt, würden Sie immer noch Sorgen machen über die Überprüfung und das Löschen der Rogue - Datei. Nur nicht wert, wenn es ein besseres Werkzeug gibt :os.rename .
mvbentes
34

Ab Python 3.4 kann man das pathlib- Modul verwenden, um dies zu lösen.

Wenn Sie auf einer älteren Version geschehen sein, können Sie die zurückportierte Version verwenden gefunden hier

Nehmen wir an, Sie befinden sich nicht im Stammpfad (nur um ein wenig Schwierigkeit hinzuzufügen), den Sie umbenennen möchten, und müssen einen vollständigen Pfad angeben. Wir können uns Folgendes ansehen:

some_path = 'a/b/c/the_file.extension'

So können Sie Ihren Weg nehmen und daraus ein PathObjekt erstellen :

from pathlib import Path
p = Path(some_path)

Um einige Informationen zu diesem Objekt bereitzustellen, das wir jetzt haben, können wir Dinge daraus extrahieren. Wenn wir beispielsweise aus irgendeinem Grund die Datei umbenennen möchten, indem wir den Dateinamen von the_filein ändern the_file_1, können wir den Dateinamen-Teil abrufen:

name_without_extension = p.stem

Und halten Sie die Erweiterung auch noch in der Hand:

ext = p.suffix

Wir können unsere Modifikation mit einer einfachen String-Manipulation durchführen:

Python 3.6 und höher verwenden F-Strings!

new_file_name = f"{name_without_extension}_1"

Andernfalls:

new_file_name = "{}_{}".format(name_without_extension, 1)

Und jetzt können wir unsere Umbenennung durchführen, indem wir die renameMethode für das von uns erstellte Pfadobjekt aufrufen und die anhängen ext, um die gewünschte Umbenennungsstruktur zu vervollständigen:

p.rename(Path(p.parent, new_file_name + ext))

In Kürze, um seine Einfachheit zu demonstrieren:

Python 3.6+:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, f"{p.stem}_1_{p.suffix}"))

Versionen unter Python 3.6 verwenden stattdessen die String-Format-Methode:

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))
Idjaw
quelle
3
Warum würden Sie dies anstelle der akzeptierten Antwort tun? Scheint viel komplizierter
Rbennell
19
Nun @rbennell, der größte Teil dieser Antwort ist eine Erklärung. Die Antwort sind wirklich nur die drei Zeilen am Ende. Darüber hinaus wird die akzeptierte Antwort explizit für genau diese Namensänderung gegeben. Diese Antwort bietet eine Möglichkeit zu zeigen, wie Sie den Dateinamen bearbeiten können, um die gewünschten Teile im Pfad oder Namen der Datei beizubehalten. Darüber hinaus wird die pathlibBibliothek in Python 3.4 eingeführt, sodass das Teilen der Antwort hier auch ein solides Modul zur Verfügung stellt, um seine Vielseitigkeit und Verwendung für kompliziertere Anforderungen zu demonstrieren.
Idjaw
4
Vielen Dank @idjaw, Ihr Kommentar ist eine gute Antwort auf eine grundlegende Frage von uns Anfängern, eine einfache Warum haben Sie das getan? . Es ist auch erfrischend zu sehen, wie im Internet nicht feindselig mit dem umgegangen wird, was oft als unwissend angesehen wird.
Igor V.
3
@ SasukeUchiha - Die {}sind für die Formatierung von Zeichenfolgen, über die Sie hier lesen können . Letztendlich passiert, dass das {}Get durch die Variablen ersetzt wird, die an die formatMethode übergeben werden. Das erste {}wird also das enthalten, was drin ist name_without_extension, und das zweite wird das zweite Argument enthalten, das einfach ist 1.
Idjaw
3
Die Verwendung von F-Strings vereinfacht dies noch mehr. aus pathlib import Path p = Path (some_path) version = 1 p.rename (Path (p.parent, f "{p.stem} _ {version}" + p.suffix))
Liquidgenius
8

Verwenden Sie os.rename. Sie müssen jedoch den vollständigen Pfad beider Dateien an die Funktion übergeben. Wenn ich eine Datei a.txtauf meinem Desktop habe, werde ich das auch tun und ich muss auch voll umbenannte Datei geben.

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')
einsamer Wolf
quelle
1
"Muss" ist nicht wahr. Sie können einen absoluten Dateinamen jederzeit durch einen relativen Dateinamen ersetzen und umgekehrt. Was Anfänger normalerweise beißt, ist, dass sie nicht verstehen, wie sich relative Dateinamen auf das aktuelle Arbeitsverzeichnis beziehen.
Tripleee
3
import os

# Set the path
path = 'a\\b\\c'  
# save current working directory
saved_cwd = os.getcwd()
# change your cwd to the directory which contains files
os.chdir(path)
os.rename('a.txt', 'b.klm')
# moving back to the directory you were in 
os.chdir(saved_cwd)
Tilak M Divakar
quelle
1
Seien Sie vorsichtig, wenn Sie es so machen. Sie können nicht immer chdir()in ein Verzeichnis wechseln, z. B. was passiert unter Windows, wenn es sich um ein UNC handelt? Und a zu tun chdir()hat Nebenwirkungen. Ich würde lieber nur die notwendigen Pfade os.rename()direkt angeben , nein chdir()ing.
JonBrave
0

Sie können os.system verwenden, um das Terminal aufzurufen, um die Aufgabe auszuführen:

os.system('mv oldfile newfile')

quelle
Ja, dies funktioniert nur auf einem Unix-basierten Computer, ebenso mvwie ein in Unix integriertes Befehlszeilenprogramm zum Verschieben / Umbenennen einer Datei.
Mikhail Geyer
8
Warum sollten Sie ein Terminal aufrufen und einen UNIX-Befehl definieren, wenn Sie dies plattformübergreifend von Python aus tun können?
EndermanAPM
0
import os
import re
from pathlib import Path

for f in os.listdir(training_data_dir2):
  for file in os.listdir( training_data_dir2 + '/' + f):
    oldfile= Path(training_data_dir2 + '/' + f + '/' + file)
    newfile = Path(training_data_dir2 + '/' + f + '/' + file[49:])
    p=oldfile
    p.rename(newfile)
issam
quelle
1
Ein hartcodierter Schrägstrich als Pfadtrenner und das Mischen von altem os.pathmit modernem Stil pathlibist ziemlich zweifelhaft. Gehen Sie pathlibstattdessen den ganzen Weg mit .
Tripleee
0
import shutil
import os

files = os.listdir("./pics/") 

for key in range(0, len(files)):
   print files[key]
   shutil.move("./pics/" + files[key],"./pics/img" + str(key) + ".jpeg")

Das sollte es tun. Python 3+

Naveen
quelle
... oder verwenden Sie enumerate für eine etwas besser lesbare Version: für Schlüssel fname in enumerate (Dateien):…
Nicolas D