1

私は友人のためにPythonスクリプトを書きました:

  1. 彼女がカタログ化している写真の CSV を取得します。これには、順序付けられたリストに写真の名前が含まれています
  2. ファイルシステムで画像ファイルを見つけます
  3. csv 内のファイルとシステム上のファイルを照合します
  4. ファイルシステム上の画像を、ファイルが CSV に表示される順序で Figure 名のフォルダーにコピーします

したがって、基本的には次のようになります。


入力: myphoto1.tiff、mypainting.jpeg、myphoto9.jpg、orderedlist.csv

出力: fig001.jpg、fig002.tiff、fig003.jpeg


このコードは Mac 上で実行されます。これは問題なく動作しますが、一部のファイル (すべて同じ写真家によるもの) に 1 つのブラケットが含まれているという問題が発生しました。

myphoto[fromitaly.jpg

これは私の正規表現検索を壊しているようです:

関連するコード:

orderedpaths = [path for item in target for path in filenames if re.search(item, path)]

filenames はシステム上の写真ファイルのリストであり、target は CSV からのリストです。このコードは、システム上のファイル名の順序付きリストを提供するために、CSV ファイル名 (およびリスト内の後続の順序) をファイル名に一致させることになっています。

エラー:

Traceback (most recent call last):
  File "renameimages.py", line 43, in <module>
    orderedpaths = [path for item in target for path in filenames if re.search(item, path)]
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 142, in search
    return _compile(pattern, flags).search(string)
  File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/re.py", line 244, in _compile
    raise error, v # invalid expression
sre_constants.error: unexpected end of regular expression

私は試したり考えたりしました:

  1. ファイル名/csv を変更しますが、これはスケーラブルではなく、理想的には彼女の部門は将来このスクリプトをより多く使用することになります
  2. ファイルを「生」として扱うことを調査していますが、CSV からの入力ではそれが可能ではないようでした。
  3. 入力から [ 文字を削除しますが、問題は、入力がシステム上の実際のファイルと一致しないことです。

コードの進行状況を出力すると、コードがブラケットとエラーを含む CSV アイテムに到達したように見えます。

4

1 に答える 1

3

関連するコードは、サニタイズせずに、ユーザー入力を使用して正規表現を構築する部分です。あなたはそれをすべきではありません。

RE を使用する必要はまったくないと思います。if item in pathまたはpath.endswith(item)またはそのようなものを使用して、一致する文字列を見つけることができます。

最良のオプションは、ライブラリを使用することです。

from os.path import basename
orderedpaths = [ ... if basename(path) == item]

正規表現の使用を主張する場合は、次を使用して入力をエスケープする必要がありますre.escape()

orderedpaths = [path for item in target for path in filenames
                 if re.search(re.escape(item), path)]
于 2013-06-02T23:05:01.513 に答える