2017-07-16 101 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

相關問題