web-dev-qa-db-ja.com

Pythonを使用してディレクトリ内の複数のファイルの名前を変更する

このPythonスクリプトを使用して、ディレクトリ内の複数のファイルの名前を変更しようとしています:

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)
i = 1

for file in files:
    os.rename(file, str(i)+'.jpg')
    i = i+1

このスクリプトを実行すると、次のエラーが表示されます。

Traceback (most recent call last):
  File "rename.py", line 7, in <module>
    os.rename(file, str(i)+'.jpg')
OSError: [Errno 2] No such file or directory

何故ですか?この問題を解決するにはどうすればよいですか?

ありがとう。

15
Simplicity

名前を変更する際にパス全体を渡すのではなく、次のようにします。

import os
path = '/Users/myName/Desktop/directory'
files = os.listdir(path)


for index, file in enumerate(files):
    os.rename(os.path.join(path, file), os.path.join(path, ''.join(str(index), '.jpg')))

編集:tavoのおかげで、最初の解決策はファイルを現在のディレクトリに移動し、それを修正しました。

52
noteness

まず、このパスを現在の作業ディレクトリとして作成する必要があります。簡単です。残りのコードにはエラーはありません。

現在の作業ディレクトリにするには:

os.chdir(path)
4
Abid413119

@danielのコメントによると、os.listdir()はファイルの完全なパスではなく、ファイル名のみを返します。 os.path.join(path、file)を使用してフルパスを取得し、その名前を変更します。

import os
path = 'C:\\Users\\Admin\\Desktop\\Jayesh'
files = os.listdir(path)
for file in files:
   os.rename(os.path.join(path, file), os.path.join(path, 'xyz_' + file + '.csv'))
2
jayesh

受け入れられた答えで遊ぶだけで、パス変数とリストを定義します。

path = "/Your/path/to/folder/"
files = os.listdir(path)

そして、そのリストをループします:

for index, file in enumerate(files):
    #print (file)
    os.rename(path+file, path +'file_' + str(index)+ '.jpg')

またはpython list comprehensionのように1行で同じ方法でループします:

[os.rename(path+file, path +'jog_' + str(index)+ '.jpg')  for index, file in enumerate(files)]

私は最初の方が読みやすいと思います、2番目ではループの最初の部分はリスト内包のちょうど2番目の部分です

0
sivi

ファイルの名前がランダムに変更されている場合は、最初にディレクトリ内のファイルを並べ替える必要があります。指定されたコードは、最初にソートしてからファイルの名前を変更します。

import os
import re
path = 'target_folder_directory'
files = os.listdir(path)
files.sort(key=lambda var:[int(x) if x.isdigit() else x for x in re.findall(r'[^0-9]|[0-9]+', var)])
for i, file in enumerate(files):
    os.rename(path + file, path + "{}".format(i)+".jpg")