在第一个函数中,我试图返回newFolder,以便我可以使用它 在第二个功能。但是当调用第二个函数时,它将循环遍历整个第一个函数,而不是仅使用newFolder变量。在函数外使用全局或定义newPath时,它工作正常。我只是想知道如果有一种方法可以操作它来在函数内部工作吗?
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 :(得分:0)
你想要类似下面的代码。
我对您的代码进行了一些更改。主要的变化是我将directory
作为参数传递给每个函数。我还将newFolder
名称传递给move_files
函数。将args传递给函数而不是从全局变量中读取数据通常会更好。
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
在Python 3.6.0上测试。如果您将input
调用更改为raw_input
,它也适用于Python 2。
请注意,目标文件夹可以是绝对路径,或者您可以在directory
中提供相对于源目录的路径。