使用部分名称的python在目录中查找文件

时间:2014-09-22 22:34:55

标签: python regex glob

我有一个包含数十万个文件的目录。

他们都遵循以下格式:

datetime_fileid_metadata_collect.txt

一个具体的例子如下:

201405052359559_0002230255_35702088_collect88.txt

我正在尝试编写一个脚本,当我提供的所有文件都是文件ID列表时,它会拉出并复制单个文件。

例如,我有一个文本文件fileids.txt,它构成了这个

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 '*') 

用于查找文件名中的内容。不删除行空间是个问题。

2 个答案:

答案 0 :(得分:2)

text_file.readlines()读取整行,包括尾随' \ n'。尝试剥离它。以下将删除换行符并删除空白:

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

答案 1 :(得分:1)

您的问题可能是行空间,可能已经得到了回答,但我认为您可以对代码进行一些清理。诚然,我不认为需要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是一项相当昂贵的操作。你最好在一开始就列出文件,然后在匹配时复制它们。希望这会有所帮助。