2017-03-21 10 views
0

最初の関数でnewFolderを返そうとしましたので、2番目の関数で を使用できます。 2番目の関数が呼び出されると、newFolder変数のみを使用するのではなく、最初の関数全体をループし続けます。グローバルを使用している場合や関数外でnewPathを定義している場合は正常に動作します。私はちょうど知りたい機能内で動作するように操作する方法があるか?differentnent関数から変数を呼び出すにはどうすればよいですか?

import os 
import shutil 

directory = input("Enter the desired directory: ") 

def dir_list(): 
    os.chdir(directory) 
    subFiles = os.listdir() 
    return subFiles 


def creating_dir(): 
    newPath = input("Enter Folder name: ") 
    newFolder = (directory+'/'+newPath) 
    if not os.path.exists(newFolder): 
     os.makedirs(newFolder) 

    return newFolder 


def moving_files(): 
    for file in dir_list(): 
     if file.endswith('.gif'): 
      shutil.move(file, creating_dir()) 
     else: 
      break 



def main(): 

    dir_list() 

    creating_dir() 

    moving_files() 


if __name__ == "__main__": 
    main() 
+0

私は完全にプログラミングに新しいので、私の説明がビットnoobie場合私を許しています。 – Frozen

+0

値を返すこととパラメータを渡すことについて読むことをお勧めします。これらは機能に関する非常に重要な概念です。特に、関数の返された結果を取得する方法を学ぶ必要があります。関数に関するすべてのPythonチュートリアルでは、これを行う方法を説明します。 –

+0

あなたの関数の戻り値を 'moving_files()'に渡します。これは正しい方法です –

答えて

0

次のようなコードが必要です。

私はコードにいくつか変更を加えました。主な変更点は、関数のそれぞれに引数としてdirectoryを渡すことです。私はまた、move_files関数にnewFolderという名前を渡します。一般に、グローバル変数からデータを読み込むのではなく、関数にargを渡す方が良いです。

import os 
import shutil 

def dir_list(directory): 
    os.chdir(directory) 
    subFiles = os.listdir() 
    return subFiles 

def get_dir(directory): 
    ''' Get folder name in `directory`, and create it if it doesn't exist ''' 
    newPath = input("Enter destination folder name: ") 
    newFolder = os.path.join(directory, newPath) 
    if not os.path.exists(newFolder): 
     os.makedirs(newFolder) 
    return newFolder 

def move_files(directory, newFolder): 
    ''' Move GIF files to `newFolder` ''' 
    for file in dir_list(directory): 
     if file.endswith('.gif'): 
      fullname = os.path.join(directory, file) 
      #moves .gif to another folder 
      shutil.move(fullname, newFolder) 

def main(): 
    # Base directory 
    directory = input("Enter the desired directory: ") 
    newFolder = get_dir(directory) 
    move_files(directory, newFolder) 


if __name__ == "__main__": 
    main() 

私はbreakステートメントを取り除いたことに注意してください。そのbreakでは、ファイル移動機能はGIF以外のファイルを見るとすぐに停止します。私のバージョンでは、非GIFは単にスキップされます。

また、os.listdir関数は、基本ファイル名ではなく、の完全なファイルパスを返します。したがって、完全なファイル名を取得するには、os.listdirからdirectoryに返されたリストからファイル名を結合する必要があります。

ディレクトリ名をベースファイル名に結合するのに私はos.path.joinを使用します。私はnewFolderという名前を作成します。これは、Pythonの3.6.0でテスト例えば

directory + '/' + file 

安全でやっによる接合よりも移植性があります。 inputの呼び出しをraw_inputに変更すると、Python 2でも動作します。

宛先フォルダは絶対パスにすることも、ソースディレクトリに関連するパスをdirectoryに指定することもできます。

+0

あなたのコードを実行すると同じ問題が発生します。 1つの必須の位置引数 'directory'がありません – Frozen

+0

あなたのコードにdir_lis()という名前の関数がないので、間違いだと思いました。 – Frozen

+0

umm ... OPの元の投稿に 'dir_list()'関数があります。 –

関連する問題