1

ファイルのリストの拡張子を、txt を rar に変更するなど、別の拡張子に変更する Python 関数を作成しています。これは単なるアイドル例です。しかし、私はエラーが発生しています。コードは次のとおりです。

import os
def dTask():
    #Get a file name list
    file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')
    #Change the extensions
    for file_name in file_list:
        entry_pos = 0;
        #Filter the file name first for '.'
        for position in range(0, len(file_name)):
            if file_name[position] == '.':
                break
        new_file_name = file_name[0:position]
        #Filtering done !
        #Using the name filtered, add extension to that name
        new_file_name = new_file_name + '.rar'
        #rename the entry in the file list, using new file name
        print 'Expected change from: ', file_list[entry_pos]
        print 'into File name: ', new_file_name
        os.rename(file_list[entry_pos], new_file_name)
        ++entry_pos
Error:
>>> dTask()
Expected change from:  New Text Document (2).txt
into File name:  New Text Document (2).rar
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    dTask()
  File "C:\Users\B\Desktop\dTask.py", line 19, in dTask
    os.rename(file_list[entry_pos], new_file_name)
WindowsError: [Error 2] The system cannot find the file specified

プリントアウトでわかるように、可変レベルで別の拡張子を持つファイル名を取得することに成功しますが、OS レベルでこのプロセスを終了できないため、実際にはそうではありません。エラーは os.rename(...) から来ています。これを修正する方法はありますか?

4

6 に答える 6

9
  1. 他の人がすでに述べているように、これらのファイルへのパスを提供するか、現在の作業ディレクトリを切り替えて、OS がファイルを見つけられるようにする必要があります。

  2. ++entry_pos何もしません。Python にはインクリメント演算子はありません。接頭辞+は、接頭辞との対称性のためにちょうどそこにあります-。何かに 2のプレフィックスを付けることは、2+つのノーオペレーションにすぎません。したがって、実際には何もしていません (そして、それを に変更した後でもentry_pos += 1、各反復でそれをゼロにリセットしています。

  3. また、あなたのコードは非常に洗練されていません。たとえば、別のインデックスを使用してfile_listいて、それを反復変数と同期させることfile_nameができませんでした。これを改善する方法を示します。

-

def rename_by_ext(to_ext, path):
    if to_ext[0] != '.':
        to_ext = '.'+to_ext
    print "Renaming files in", path
    for file_name in os.listdir(path):
        root, ext = os.path.splitext(file_name)
        print "Renaming", file_name, "to", root+ext
        os.rename(os.path.join(path, file_name), os.path.join(path, root+to_ext))
rename_by_ext('.rar', '...')
于 2010-11-10T18:15:01.350 に答える
2

また、バックスラッシュを二重にして Python 文字列でエスケープする必要があるため、代わりに

file_list = os.listdir('C:\Users\B\Desktop\sil\sil2')

あなたが欲しい

file_list = os.listdir('C:\\Users\\B\\Desktop\\sil\\sil2')

または、スラッシュを使用します。Python は、魔法のようにそれらを Windows のパス区切り記号として扱います。

于 2010-11-10T18:44:34.577 に答える
1

名前の変更には絶対パスを使用する必要があります。

import os
def dTask():
    #Get a file name list
    dir = 'C:\Users\B\Desktop\sil\sil2'
    file_list = os.listdir(dir)
    #Change the extensions
    for file_name in file_list:
        entry_pos = 0;
        #Filter the file name first for '.'
        for position in range(0, len(file_name)):
            if file_name[position] == '.':
                break
        new_file_name = file_name[0:position]
        #Filtering done !
        #Using the name filtered, add extension to that name
        new_file_name = new_file_name + '.rar'
        #rename the entry in the file list, using new file name
        print 'Expected change from: ', file_list[entry_pos]
        print 'into File name: ', new_file_name
        os.rename( os.path.join(dir, file_list[entry_pos]), os.path.join(dir,new_file_name))
        ++entry_pos
于 2010-11-10T17:57:56.557 に答える
0

ディレクトリC:\Users\B\Desktop\sil\sil2にいない場合、Python は確かにそれらのファイルを見つけることができません。

于 2010-11-10T17:59:43.543 に答える
-4
import os

def extChange(path,newExt,oldExt=""):
    if path.endswith != "\\" and path.endswith != "/":
        myPath = path + "\\"
    directory = os.listdir(myPath)
    for i in directory:
        x = myPath + i[:-4] + "." + newExt
        y = myPath + i
        if oldExt == "":
            os.rename(y,x)
        else:
            if i[-4:] == "." + oldExt:
                os.rename(y,x)

今それを呼び出します:

extChange("C:/testfolder/","txt","lua") #this will change all .txt files in C:/testfolder to .lua files
extChange("C:/testfolder/","txt") #leaving the last parameter out will change all files in C:/testfolder to .txt
于 2011-03-17T20:37:47.980 に答える