私は、フォルダーを検索し、入力リストからの値のリストに基づいて一致するファイル名を見つけてから、それらをフォルダーにコピーするプログラムに取り組んできました。プログラムは動作しますが、もう 1 つのレイヤーを追加したいと思います。一致しないサンプルのリストを取得し、CSV ファイルに出力します。コードは効率的ではありませんが、私が要求したことを実行するように適切に設定されていない可能性があることは承知していますが、仕事は完了します。
import os, fnmatch, csv, shutil, operator
#Function created to search through a folder location to for using a specific list of keywords
def locate(pattern, root=os.curdir):
matches = []
for path, dirs, files in os.walk(os.path.abspath(root)):
for filename in fnmatch.filter(files, pattern):
matches.append(os.path.join(path, filename))
return matches
#output file created to store the pathfiles
outfile="G:\output.csv"
output=csv.writer(open(outfile,'w'), delimiter=',',quoting=csv.QUOTE_NONE)
#Opens the file and stores the values in each row
path="G:\GIS\Parsons Stuff\samples.csv"
pathfile=open(path,'rb')
openfile=csv.reader((pathfile), delimiter = ',')
samplelist=[]
samplelist.extend(openfile)
#for loop used to return the list of tuples
for checklist in zip(*samplelist):
print checklist
#an empty list used to store the filepaths of sample locations of interest
files=[]
#for loop to search for sample id's in a folder and copies the filepath
for x in checklist:
LocatedFiles=locate(x, "G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\")
print LocatedFiles
files.append(LocatedFiles)
# flattens the list called files into a managable list
flattenedpath=reduce(operator.add, files)
#filters out files that match the filter .pdf
filteredpath=[]
filteredpath.append(fnmatch.filter(flattenedpath,"*.pdf*"))
#outputs the file path a .csv file called output
output.writerows(files)
pathfile.close()
#location of where files are going to be copied
dst='C:\\TestFolder\\'
#filters out files that match the filer .pdf
filtered=[]
filtered.append(fnmatch.filter(flattenedpath,"*.pdf*"))
filteredpath=reduce(operator.add,filtered)
#the function set() goes through the list of interest to store a list a unique values.
delete_dup=set(filteredpath)
delete_dup=reduce(operator.add,zip(delete_dup))
#for loop to copy files in the list delete_dup
for x in delete_dup:
shutil.copy(x,dst)
リスト「samplelist」と「files」は同じ長さなので、私の考えは次のとおりです。
len(samplelist)
36
len(files)
36
「ファイル」から各空のリストのインデックス値を引き出し、それを「サンプルリスト」から要素を引き出すために使用できるインデックス値を格納するリストに渡すことができるはずです。
これを行うためのアイデアについて次のリンクを使用してみましたが、うまくいきませんでした:
Python では、リスト内の値ではない最初の項目のインデックスを見つけるにはどうすればよいですか?
Pythonでそれを含むリストが与えられたアイテムのインデックスを見つける
2 つのリストを比較し、違いを出力する Python の方法
以下は、「samplelist」というリストからの出力です。
('*S42TPZ2*', '*S3138*', '*S2415*', '*S2378*', '*S2310*', '*S2299*', '*S1778*', '*S1777*', '*S1776*', '*S1408*', '*S1340*', '*S1327*', '*RW-61*', '*MW-247*', '*MW-229*', '*MW-228*', '*MW-209*', '*MW-208*', '*MW-193*', '*M51TPZ6*', '*M51TP21*', '*H1013*', '*H1001*', '*H0858*', '*H0843*', '*H0834*', '*H0514*', '*H0451*', '*H0450*', '*EY1TP9*', '*EY1TP7*', '*EY1TP6*', '*EY1TP5*', '*EY1TP4*', '*EY1TP2*', '*EY1TP1*')
以下は、「ファイル」と呼ばれるリストからの出力です(すべての出力をリストするつもりはありません。不要なので、リストがどのように見えるかを示したかっただけです)。
[[], [], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S2415.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S2378.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\MW-247.S2310.pdf', 'G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S2310.MW-247.pdf', 'G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S2310.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S2299.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S1778.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S1777.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S1776.pdf'], ['G:\\GIS\\Parsons Stuff\\boring logs\\boring logs\\S1408.pdf']