2014-09-22 45 views
0

我有一個包含數十萬個文件的目錄。使用python以部分名稱查找文件

他們都遵循以下格式:

datetime_fileid_metadata_collect.txt 

一個具體的例子是這樣的:

201405052359559_0002230255_35702088_collect88.txt 

我嘗試寫翻出並複製單個文件時,所有我提供它的腳本是文件ID的列表。

比如我有一個文本文件fileids.txt是constains這

fileids.txt 
0002230255 
0001627237 
0001023000 

這是示例腳本到目前爲止,我已經寫了。 file1結果不斷返回[]

import os 
import re, glob, shutil 
base_dir = 'c:/stuff/tub_0_data/' 
destination = 'c:/files_goes_here' 
os.chdir(base_dir) 
text_file = open('c:/stuff/fileids.txt', 'r') 
file_ids = text_file.readlines() 
#file_ids = [stripped for stripped in (line.strip() for line in text_file.readlines()) if stripped] 
for ids in file_ids: 
    id1 = ids.rstrip() 
    print 'file id = ',str(id1) 
    file1 = glob.glob('*' + str(id1) + '*') 
    print str(file1) 
    if file1 != []: 
     shutil.copy(base_dir + file1, destination) 

我知道我還沒有完全理解glob或正則表達式。如果我想根據文件名的特定字符串查找文件,那麼我會放在那裏?

編輯:

glob.glob('*' + stuff '*') 

供職的文件名中找到的東西。不刪除行空間是問題。

+0

將此行更改爲:'file_ids = text.file.readlines()'到'file_ids = text_file.readlines()'並再次運行。 '_'上的錯字可能是個問題。 – Manhattan 2014-09-22 22:40:35

+0

已修復,它實際上是一個更大的腳本的一部分,並且在原始代碼中不存在拼寫錯誤。我只是重寫了我的問題的核心代碼。 glob.glob是我相信我的問題所在。 – AlienAnarchist 2014-09-22 22:44:07

回答

2

text_file.readlines()讀取整行,包括尾部'\ n'。嘗試剝離它。下面將去掉換行,並刪除清空:

file_ids = [line.strip() for line in text_file if not line.isspace()] 
+0

這不是在IDLE工作。 「在text_file中的逗號,readlies()'的逗號造成錯誤 – AlienAnarchist 2014-09-22 22:49:32

+0

@AlienAnarchist - 是啊,我剛剛注意到了,那應該是一段時間,修復它 – tdelaney 2014-09-22 22:49:58

+0

仍然[]返回每個條目 – AlienAnarchist 2014-09-22 22:50:45

1

您的問題可能已經linespace,它可能已經回答了,但我認爲你可以用一些代碼清理做。誠然,我不認爲需要import osimport sys,除非它們是您較大代碼的一部分。

像下面這樣工作得很好。

代碼:

import glob 
import shutil 

base_dir = "C:/Downloads/TestOne/" 
dest_dir = "C:/Downloads/TestTwo/" 

with open("blah.txt", "rb") as ofile: 
    lines = [line.strip() for line in ofile.readlines()] 
    for line in lines: 
     print "File ID to Process: {}".format(line) 
     pattern_ = base_dir + "*" + str(line) + "*" 
     print pattern_ 
     file_ = glob.glob(pattern_) 
     print str(file_[0]) 
     shutil.copy(file_[0], dest_dir) 
     print "{} copied.".format(file_[0]) 

輸出:

File ID to Process: 123456 
C:/Downloads/TestOne/*123456* 
C:/Downloads/TestOne\foobar_123456_spam.txt 
C:/Downloads/TestOne\foobar_123456_spam.txt copied. 
[Finished in 0.4s] 

glob是一個相當昂貴的操作雖然。您最好在起步時列出文件並在之後與之匹配,並在比賽中進行復制。希望這可以幫助。

+1

我同意glob是緩慢的方式去,這就是爲什麼我堅持readlines在我的答案...有一個列表中的fileids.txt行是很好,如果OP更改他的代碼與os.listdir迭代。 – tdelaney 2014-09-22 23:07:43

+0

同意。即使'glob'不使用'regex',我認爲它所基於的Unix特性不可能比解析列表所需的微秒更快。而且,更簡潔的代碼總是一個優點。 – Manhattan 2014-09-22 23:11:40

相關問題