【问题标题】:Move Certain Files from One Directory to Another - Python将某些文件从一个目录移动到另一个目录 - Python
【发布时间】:2017-07-16 14:14:32
【问题描述】:

全部,

我需要将文件从一个目录移动到另一个目录,但我不想移动该目录中的所有文件,只移动以'pws' 开头的文本文件。目录中所有文件的list 是:

['pws1.txt', 'pws2.txt', 'pws3.txt', 'pws4.txt', 'pws5.txt', 'x.txt', 'y.txt']

如前所述,我想将 'pws*' 文件移动到另一个目录,而不是 x 和 y 文本文件。我想要做的是删除所有不以'pws' 开头的list 元素。我的代码如下:

loc = 'C:\Test1'
dir = os.listdir(loc)

#print dir

for i in dir:
#print i
x = 'pws*'
if i != x:
dir.remove(i)
print dir

输出没有保留我想要的内容

它从list 和偶数中删除 x 文本文件,但保留 y 文本文件。

我做错了什么。如何仅对以'pws' 开头的文件创建list,并删除不以'pws' 开头的文本文件。

请记住,我可能有一个包含 1000 个元素的 list,其中数百个元素将以 'pws' 开头,而那些不以它开头的元素(数百个)将需要删除。

非常感谢大家的帮助。

【问题讨论】:

标签: python list file directory


【解决方案1】:

您可以使用list-comprehension 重新创建list,如下所示:

dir = [i for i in dir if i.startswith('pws')]

或者更好的是,在开始时定义:

loc = 'C:\\Test1'
dir = [i for i in os.listdir(loc) if i.startswith('pws')]
print dir

说明:

当您使用x = 'pws*' 然后检查if i == x 时,您正在比较元素i 是否等于'pws*',因此更好的方法是使用str.startswith() 内置方法来检查是否string 以提供的 substring 开头。所以在你的loop 中你可以使用if i.startswith('pws') 或者你可以使用list-comprehension 就像我上面提到的那样,这是一种更加pythonic 的方法。

【讨论】:

  • 谢谢。我运行了编辑后的代码,但在 dir = [i for i in .... 中不断收到与“for”相关的语法错误
  • @duranil 将此行 loc = 'C:\Test1' 更改为 loc = 'C:\\Test1' 因为您需要避免反弹
【解决方案2】:

要移动文件: How to move a file in Python 你可以使用 os.rename(origin,destination)

origin = r'C:\users\JohnDoe\Desktop'
destination = r'C:\users\JohnDoe\Desktop\Test'
startswith_ = 'pws'

然后继续做一个列表理解

# Move files
[os.rename(os.path.join(origin,i),os.path.join(destination,i)) for i in os.listdir(origin) if i.startswith(startswith_)]

【讨论】:

    【解决方案3】:

    只需使用glob。这为您提供了目录中的文件列表,没有所有 listdir 调用和子字符串匹配:

    import glob,os
    for f in glob.glob('/tmp/foo/pws*'):
        os.rename(f, '/tmp/bar/%s'%(os.path.basename(f)))
    

    编辑 1:这是您的原始代码,使用 glob 进行了简化,并定义了一个新变量 loc2 将它们移动到的位置:

    import os,glob
    loc = 'C:\Test1'
    loc2 = 'C:\Test2'
    files = glob.glob('%s\pws*'%(loc))
    
    for i in files:
        os.rename(i,'%s\%s'%(loc2,os.path.basename(i)))
    

    【讨论】:

    • @duranil,代码确实做了一些事情。哪个部分不工作? glob 是否提供了您期望的文件列表? os.rename 不会将它们移动到目的地吗?
    猜你喜欢
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-26
    • 1970-01-01
    • 2021-06-16
    • 2017-06-09
    相关资源
    最近更新 更多