1

我为一个朋友写了一个python脚本:

  1. 拍摄她一直在编目的照片的 CSV,其中照片的名称在有序列表中
  2. 查找文件系统上的图像文件
  3. 将 csv 中的文件与系统上的文件匹配
  4. 按照文件在 CSV 中出现的顺序,将文件系统上的图像复制到具有图形名称的文件夹中

所以本质上,它确实:


输入: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您可以使用orpath.endswith(item)或类似的东西找到匹配的字符串。

最好的选择是使用您的库:

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

如果您坚持使用 RE,则应使用以下命令转义您的输入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 回答