2017-03-21 1 views
0

첫 번째 함수에서 newFolder를 반환하려고 했으므로 두 번째 함수에서 을 사용할 수 있습니다. 하지만 두 번째 함수가 호출되면 newFolder 변수 만 사용하는 대신 첫 번째 함수 전체를 루핑하게됩니다. 함수를 사용하는 전역 또는 newPath를 정의 할 때 잘 작동합니다. 그저 함수 안에서 작동하도록 조작하는 방법이 있는지 알고 싶습니다.differnent 함수에서 변수를 호출하려면 어떻게해야합니까?

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

값을 반환하고 매개 변수를 전달하는 방법에 대해 읽어 보시기 바랍니다. 이것들은 기능에 대한 매우 중요한 개념입니다. 특히 함수의 반환 된 결과를 캡처하는 방법을 배워야합니다. 함수에 대한 모든 파이썬 자습서는 이것을 수행하는 방법을 보여줍니다. –

+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 이름을 사용합니다. 이것은 예를 들어

directory + '/' + file 

파이썬 3.6.0에서 테스트, 안전하고 수행하여 결합보다 더 많은 휴대용입니다. input 호출을 raw_input으로 변경하면 Python 2에서도 작동합니다.

대상 폴더는 절대 경로 일 수 있으며 원본 디렉터리의 상대 경로는 directory이라고 지정할 수 있습니다.

+0

동일한 문제 코드를 실행할 때 발생합니다. missing 1 required position arguments 'directory' – Frozen

+0

코드에 dir_lis()라는 이름의 함수가 없기 때문에 실수라고 생각했습니다. – Frozen

+0

음 ... OP의 원래 게시물에'dir_list()'함수가 있습니다. –

관련 문제