2017-07-16 123 views
1

所有,将某些文件从一个目录到另一个 - Python的

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

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

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

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'开头的文本文件。

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

大家的帮助非常感谢。

+0

的可能的复制[如何将Python中的文件(https://stackoverflow.com/questions/8858008/how-to-move-a-file-in-python) – dlmeetei

回答

2

您可以使用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的方法。

+0

谢谢。我跑了编辑的代码,但我不断收到与“for”有关的语法错误在dir = [i for i in .... – duranil

+0

@duranil更改此行'loc ='C:\ Test1'到'loc =' C:\\ Test1''因为你需要逃避反弹 –

0

要移动一个文件: How to move a file in Python 可以使用os.rename(出发地,目的地)

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_)] 
0

只需使用一个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))) 
+0

谢谢。该代码没有做任何事情。 – duranil

+0

@duranil,代码肯定是_something_。什么部分不起作用? glob是否提供您期望的文件列表? os.rename是否不将它们移动到目的地? – CDahn

相关问题