我有一个包含数十万个文件的目录。
他们都遵循以下格式:
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 '*')
用于查找文件名中的内容。不删除行空间是个问题。
答案 0 :(得分:2)
text_file.readlines()读取整行,包括尾随' \ n'。尝试剥离它。以下将删除换行符并删除空白:
file_ids = [line.strip() for line in text_file if not line.isspace()]
答案 1 :(得分:1)
您的问题可能是行空间,可能已经得到了回答,但我认为您可以对代码进行一些清理。诚然,我不认为需要import os
和import 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
是一项相当昂贵的操作。你最好在一开始就列出文件,然后在匹配时复制它们。希望这会有所帮助。