2016-05-18 3 views
0

/パスには数千のpdfファイルのフォルダがあり、names.csvという名前の何百もの名前のリストがあります簡単に.txtにすることができます)。ディレクトリ内のファイルを選択し、ファイル名のテキストリストに基づいて移動します

私はnames.csvからの任意の名前が任意のファイル名で見つけられるpdfsを選択(そして理想的には移動)しようとしています。私の研究から

LISTDIRと正規表現は、少なくとも私はしたいファイルのリストを取得する一つのアプローチであるように、これまで、それはそう:

import os, sys 
import re 


for files in os.listdir('path'): 
    with open('names.csv') as names: 
     for name in names: 
      match = re.search(name, files) 

     print match 

しかし、現在、これは単に「なし」「なし」を返すされていません等、すべての方法をダウン。

私はおそらくここで間違ったことをしています。私はファイルを移動する必要がある部分の近くにいません。しかし、私はちょうどこの最初のこぶを乗り越えることを望んでいます。

アドバイスはありがとうございます!

答えて

1

問題は、nameという変数は常に改行文字で終わる\nです。改行文字はファイル名には存在しないので、regexは一致するものを見つけません。

あなたのコードと他のいくつかの小さな問題もあります。

  • あなたは、ループの各反復でnames.csvファイルを開いています。ファイルを一度開いた後、ディレクトリ内のすべてのファイルをループする方が効率的です。
  • 正規表現はここでは必要ではなく、実際問題を引き起こす可能性があります。たとえば、csvファイルの行が(this isn't a valid regexのように見える場合、コードで例外がスローされます。これは最初にescapingで修正できますが、正規表現はまだ必要ありません。
  • print matchの場所が間違っています。ループの各繰り返しでmatchが上書きされ、の後にループの後に表示されるので、最後の値だけが表示されます。

固定コードは次のようになります。

import os 

# open the file, make a list of all filenames, close the file 
with open('names.csv') as names_file: 
    # use .strip() to remove trailing whitespace and line breaks 
    names= [line.strip() for line in names_file] 

for filename in os.listdir('path'): 
    for name in names: 
     # no need for re.search, just use the "in" operator 
     if name in filename: 
      # move the file 
      os.rename(os.path.join('path', filename), '/path/to/somewhere/else') 
      break 
+0

ありがとうございました。はい、私は '文字列内の部分文字列'がうまくいくと思っていましたが、どういうわけか私は正規表現に迷い込んでいました。 私はあなたの提案に基づいてこれを行う予定です。ありがとうbazillion! – 1rick

+1

これをフォローアップするために、私はあなたのコメントに基づいて動作するようにしました。私はファイル*セクションを*移動してしまったので、その行を 'print filename'だけに置き換えました。そこから、forループで 'shutil.move(name、destinationfolder)'を使用して、移動プロセスに全く別のスクリプトを使用しました。 いずれにしても、この赤ちゃんの援助に感謝します。 :) – 1rick

1

あなたのnames.csvが1列であることを言います。つまり、各名前の後に改行文字が続き、マッチするときに改行文字も含まれます。あなたはこれを試すことができます:

match = re.search(name.rstrip(), files) 

希望に役立ちます。

関連する問題