Pythonを使用してファイルの名前を変更する方法


回答:


578

使用os.rename

import os

os.rename('a.txt', 'b.kml')

52
ファイルが作業ディレクトリにない場合は、フルパスが必要になることに注意してください。
EndermanAPM 2017年

3.7 ubuntuでは、相対パスを使用すると
うまくいき

2
@toing_toingもちろん動作します。おそらく、現在のディレクトリに注意し、相対パスを指定するか、絶対パス(C:/folder/file.txtWindowsや/home/file.txtLinux / MacOSなど)を使用する必要があることを意味します。
Alex P.

これはUnixライクなシステムでは警告なしにファイルを上書きしますがOSError、Windowsシステムでは失敗することに注意してください。os.path.exists名前を変更する前に、ターゲットが存在するかどうかを確認するために使用する必要があります。これにより、「チェックから使用までの時間」のバグが発生しますが、問題が発生することはほとんどありません。(私はこれを回避する簡単な方法を知っている-を参照してここに
AnnanFay

2
ユーザーが実際にファイルがどのオペレーティングシステム上で交換することを希望する場合は、1を使うべきos.replace
LucG

73

ファイルはディレクトリ内にある場合があります。その場合、パスを指定します。

import os
old_file = os.path.join("directory", "a.txt")
new_file = os.path.join("directory", "b.kml")
os.rename(old_file, new_file)

50
import shutil

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

これは、ファイルの名前変更または移動に役立ちます。


32
shutil.moveアトミック操作ではないため、これは適切なオプションではありません。たとえば、ファイルが開いている場合は、でファイルがshutil.move作成されますが、ではファイルがnew_name削除されないold_nameため、2つのファイルが残ります。os.rename一方、何もしません。これはより良いオプションです。を使用するshutil.moveと、エラーが発生した場合でも、不正なファイルの確認と削除について心配する必要があります。より良いツールが存在するos.rename場合それだけの価値はありません。
mvbentes 2017

34

Python 3.4以降では、pathlibモジュールを使用してこれを解決できます。

古いバージョンを使用している場合は、ここにあるバックポートされたバージョンを使用できます

あなたが名前を変更したいルートパスにいない(それを少しだけ困難にするため)のではなく、フルパスを提供する必要があるとしましょう、これを見ることができます:

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

したがって、パスを取得Pathして、そこからオブジェクトを作成できます。

from pathlib import Path
p = Path(some_path)

現在持っているこのオブジェクトに関するいくつかの情報を提供するために、オブジェクトから何かを抽出できます。たとえば、何らかの理由でファイル名をからthe_fileに変更してファイルの名前を変更する場合、ファイルthe_file_1名の部分を取得できます。

name_without_extension = p.stem

さらに、拡張機能も手元に置いておきます。

ext = p.suffix

簡単な文字列操作で変更を実行できます。

Python 3.6以降ではf-stringsを使用しています!

new_file_name = f"{name_without_extension}_1"

さもないと:

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

これrenameで、作成したパスオブジェクトのメソッドを呼び出し、を追加するextことで名前を変更し、適切な名前変更構造を完成させることができます。

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

その簡潔さを紹介するためにもう少し:

Python 3.6以降:

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

Python 3.6より前のバージョンでは、代わりに文字列フォーマット方式を使用します。

from pathlib import Path
p = Path(some_path)
p.rename(Path(p.parent, "{}_{}_{}".format(p.stem, 1, p.suffix))

3
なぜ受け入れられた答えの代わりにこれを行うのですか?はるかに複雑なようです
rbennell

19
まあ@rbennell、この答えのほとんどは説明です。答えは、実際には最後の3行だけです。さらに、受け入れられた回答は、まさにその名前の変更に対して明示的に行われます。この回答は、ファイル名を操作して、ファイルのパスまたは名前に必要な部分を保持する方法を示す方法を提供します。さらに、pathlibライブラリはpython 3.4で導入されたため、ここで答えを共有することで、より複雑な要件に対するその汎用性と使用法を紹介するための固体モジュールの公開も提供されます。
idjaw 2017

4
@idjawに感謝します。あなたのコメントは、初心者の基本的な質問に対するシンプルな回答です。。また、無知であると見なされることが多いものに対して、インターネット上で非敵対的なアプローチを目にすることは新鮮です。
イゴールV.

3
@SasukeUchiha- {}文字列フォーマット用で、ここで読むことができます。最終的に、何が起こっているかは{}formatメソッドに渡される変数でgetが置き換えられることです。したがって、1つ目{}は何が入っているかname_without_extensionを保持し、2つ目は単純に2つ目の引数を保持します1
idjaw

3
f-stringを使用すると、さらに簡単になります。from pathlib import Path p = Path(some_path)version = 1 p.rename(Path(p.parent、f "{p.stem} _ {version}" + p.suffix))
Liquidgenius


8

を使用しos.renameます。ただし、両方のファイルの完全パスを関数に渡す必要があります。a.txtデスクトップにファイルがある場合は、そうする予定です。名前を変更したファイルもすべて指定する必要があります。

 os.rename('C:\\Users\\Desktop\\a.txt', 'C:\\Users\\Desktop\\b.kml')

1
「持っている」は真実ではありません。絶対ファイル名の代わりに相対ファイル名をいつでも使用でき、その逆も可能です。通常、初心者を悩ますのは、相対ファイル名が現在の作業ディレクトリとどのように関連しているかを理解していないことです。
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)

1
この方法で行うことに注意してください。常にchdir()ディレクトリに移動できるわけではありません。たとえば、WindowsでUNCの場合はどうなりますか?そして、行うにchdir()は副作用があります。必要なパスをos.rename()直接指定するだけで、chdir()ING は行いません。
JonBrave 2018年

0

os.systemを使用してターミナルを呼び出し、タスクを実行できます。

os.system('mv oldfile newfile')

はい、これはmvファイルを移動/名前変更するためのUNIX組み込みコマンドラインプログラムと同様に、UNIXベースのマシンでのみ機能します。
ミハイルガイヤー

8
マルチプラットフォームの方法でpythonから実行できるのに、なぜ端末を起動してUNIXのみのコマンドを定義するのですか?
EndermanAPM 2017年

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)

1
パスの区切りとしてフォワードスラッシュをハードコーディングし、古いスタイルos.pathとモダンを混在させることpathlibは非常に不確かです。pathlib代わりにずっと行きます。
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")

これでうまくいくはずです。python 3+


...または、もう少し読みやすいバージョンのenumerateを使用します。キーの場合、enumerate(files)のfname:…
Nicolas D
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.