使用Python移动特定文件类型

时间:2014-05-09 03:16:21

标签: python python-2.7 file-io

我知道这对你们中的许多人来说都是令人沮丧的。我刚刚开始学习Python并需要一些基本的文件处理帮助。

我拍了很多截图,最终放在我的桌面上(因为这是默认设置)。我知道我可以更改屏幕截图设置以自动将其保存在其他位置。但是,我认为这个程序将是一个教我如何排序文件的好方法。我想使用python自动对桌面上的所有文件进行排序,找出以.png(屏幕截图的默认文件类型)结尾的文件,然后将其移动到我命名为“Archive”的文件夹中。

这是我到目前为止所得到的:

import os
import shutil
source = os.listdir('/Users/kevinconnell/Desktop/Test_Folder/')
destination = 'Archive'
for files in source:
    if files.endswith('.png'):
        shutil.move(source, destination)

我玩过很多都无济于事。在这个最新版本中,我在运行程序时遇到以下错误:

  

追踪(最近一次通话):     文件“pngmove_2.0.py”,第23行,in       shutil.move(来源,目的地)     文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py”,第290行,移动   TypeError:强制转换为Unicode:需要字符串或缓冲区,列出找到

我的印象是我对源和目标所需的正确约定/语法有一些问题。但是,到目前为止,我还没有找到很多帮助来解决它。我使用os.path.abspath()来确定您在上面看到的文件路径。

提前感谢任何帮助我保持理智。

最新更新

我相信我非常接近这个问题。我敢肯定,如果我继续玩它,我会弄明白的。就这样,所有帮助过我的人都会更新......

这是我正在使用的当前代码:

import os
import shutil
sourcepath ='/Users/kevinconnell/Desktop/'
source = os.listdir(sourcepath)
destinationpath = '/Users/kevinconnell/Desktop/'
for files in source:
    if files.endswith('.png'):
        shutil.move(os.path.join(sourcepath,'Test_Folder'), os.path.join(destinationpath,'Archive'))

这适用于将我的'Test_Folder'文件夹重命名为'Archive'。 但是,它会移动文件夹中的所有文件,而不是移动以“.png”结尾的文件。

4 个答案:

答案 0 :(得分:3)

您尝试移动整个源文件夹,需要指定文件路径

import os
import shutil
sourcepath='C:/Users/kevinconnell/Desktop/Test_Folder/'
sourcefiles = os.listdir(sourcepath)
destinationpath = 'C:/Users/kevinconnell/Desktop/Test_Folder/Archive'
for file in sourcefiles:
    if file.endswith('.png'):
        shutil.move(os.path.join(sourcepath,file), os.path.join(destinationpath,file))

答案 1 :(得分:2)

另一种选择是使用glob模块,它允许您指定文件掩码并检索所需文件的列表。 它应该像

一样简单
import glob
import shutil

# I prefer to set path and mask as variables, but of course you can use values
# inside glob() and move()

source_files='/Users/kevinconnell/Desktop/Test_Folder/*.png'
target_folder='/Users/kevinconnell/Dekstop/Test_Folder/Archive'

# retrieve file list
filelist=glob.glob(source_files)
for single_file in filemask:
     # move file with full paths as shutil.move() parameters
    shutil.move(single_file,target_folder) 

尽管如此,如果您正在使用glob或os.listdir,请记住为源文件和目标设置完整路径。

答案 2 :(得分:0)

基于@Gabriels回答。 我已经付出了一些努力,因为我喜欢"分类"我的文件类型到文件夹中。我现在用它。

我相信这就是你要找的东西,这很有趣找出

本脚本:

  • 显示要移动的示例文件,直到您取消注释shutil.move
  • 在Python3中
  • 是在MacOSX上设计的
  • 不会为您创建文件夹,会引发错误
  • 可以找到并移动您想要的扩展名的文件
  • 可用于忽略文件夹
    • 包含目标文件夹,是否应嵌套在搜索文件夹中
  • 可在我的Github Repo
  • 中找到

来自终端的示例:

$ python organize_files.py
filetomove: /Users/jkirchoff/Desktop/Screen Shot 2018-05-15 at 12.16.21 AM.png
movingfileto: /Users/jkirchoff/Pictures/Archive/Screen Shot 2018-05-15 at 12.16.21 AM.png

脚本:

我命名为organize_files.py

#!/usr/bin/env python3

# =============================================================================
# Created On  : MAC OSX High Sierra 10.13.4 (17E199)
# Created By  : Jeromie Kirchoff
# Created Date: Mon May 14 21:46:03 PDT 2018
# =============================================================================
# Answer for: https://stackoverflow.com/a/23561726/1896134 PNG Archive
# NOTE: THIS WILL NOT CREATE THE DESTINATION FOLDER(S)
# =============================================================================

import os
import shutil

file_extensn = '.png'
mac_username = 'jkirchoff'

search_dir = '/Users/' + mac_username + '/Desktop/'
target_foldr = '/Users/' + mac_username + '/Pictures/Archive/'
ignore_fldrs = [target_foldr,
                '/Users/' + mac_username + '/Documents/',
                '/Users/' + mac_username + '/AnotherFolder/'
                ]

for subdir, dirs, files in os.walk(search_dir):
    for file in files:
        if subdir not in ignore_fldrs and file.endswith(file_extensn):
            # print('I would Move this file: ' + str(subdir) + str(file)
            #       # + "\n To this folder:" + str(target_foldr) + str(file)
            #       )

            filetomove = (str(subdir) + str(file))
            movingfileto = (str(target_foldr) + str(file))
            print("filetomove: " + str(filetomove))
            print("movingfileto: " + str(movingfileto))

            # =================================================================
            # IF YOU ARE HAPPY WITH THE RESULTS
            # UNCOMMENT THE SHUTIL TO MOVE THE FILES
            # =================================================================
            # shutil.move(filetomove, movingfileto)

            pass
        elif file.endswith(file_extensn):
            # print('Theres no need to move these files: '
            #       + str(subdir) + str(file))
            pass
        else:
            # print('Theres no need to move these files either: '
            #       + str(subdir) + str(file))
            pass

答案 3 :(得分:0)

import os
import shutil
Folder_Target = input("Path Target which Contain The File Need To Move it: ")
File_Extension = input("What Is The File Extension ? [For Example >> pdf , txt , exe , ...etc] : ")
Folder_Path = input("Path To Move in it : ")
Transformes_Loges = input("Path To Send Logs Of Operation in : ")
x=0
file_logs=open(Transformes_Loges+"\\Logs.txt",mode="a+")

for folder, sub_folder, file in os.walk(Folder_Target):
    for sub_folder in file:
        if os.path.join(folder, sub_folder)[-3:]==File_Extension:
           path= os.path.join(folder, sub_folder)
           file_logs.write(path+" =====================  Was Moved to ========================>> "+Folder_Path )
           file_logs.write("\n")
           shutil.move(path, Folder_Path)
           x+=1
file_logs.close()
print("["+str(x)+"]"+"File Transformed")