【问题标题】:os.path.join generates 4 backslashes per folderos.path.join 每个文件夹生成 4 个反斜杠
【发布时间】:2013-06-11 15:51:28
【问题描述】:

我正在尝试编写一个函数,该函数在当前目录及其子文件夹中查找特定文件的第一个实例,并将相对路径作为字符串返回。

def findFirstMatch(targetFile):
    try:
        fileMatched = []
        for root, dirnames, filenames in os.walk('.'):
            for filename in fnmatch.filter(filenames, targetFile):
                fileMatched.append(os.path.join(root, filename))
            if len(fileMatched) != 0:
                fileMatched = str(fileMatched)
                return fileMatched
        if len(fileMatched) == 0:
            raise NotFoundError, 'File could not be found.'
    except NotFoundError, error:
        print error

当我这样调用函数时:

csvPath = findFirstMatch('bounding_box_limits.csv')

在 Python 控制台中运行时收到此错误消息:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "MassSpringDamperCAD.py", line 121, in <module>
    main()
  File "MassSpringDamperCAD.py", line 90, in main
    with open(csvPath, 'r') as csvFile:
IOError: [Errno 2] No such file or directory: "['.\\\\common\\\\bounding_box_limits.csv']"

它找到了文件,但所有这些额外的反斜杠是如何在文件路径中结束的?

注意:我使用的是 Windows 7 和 Python 2.7.3。

【问题讨论】:

  • 那个字符串是从哪里来的?
  • 这真的是代码吗,因为您在循环中不断将 lastFilename 设置为文件名,然后用它覆盖 fileMatched。我不明白 os.path.join 是如何参与其中的
  • @TomTanner 这是一个错误,我正在测试替代输出以确定四重反斜杠的来源。我已将代码更正为实际情况。
  • @AlexChamberlain 我编辑了帖子以包含完整的错误消息和回溯信息。当fnmatch.filter() 找到符合字符串参数targetFile 的条件的filenames 元素时,该字符串将返回。我确信没有fnmatch 有更好的方法来做到这一点,但我还没有找到它。

标签: python windows python-2.7 append os.path


【解决方案1】:

这些反斜杠是它们是反斜杠这一事实的副作用。咕咕咕:-)

在字符串中,表示反斜杠的反斜杠通常在 CLI 中以反斜杠开头,否则在特殊字符同义词之前,例如 \n 表示换行符,\t 表示制表符。根据我的经验,这些反斜杠的数量不会导致问题。您可以随时尝试通过os.path.normpath() 规范化字符串中的路径。

这个问题肯定是 Windows 特定的。

【讨论】:

  • 好的,os.path.normpath() 成功了!生成的文件路径仍然带有括号和多余的单引号,这会干扰解释;当我尝试返回 os.path.abspath(os.path.normpath(filePath)) 时,这一点变得很明显。我申请了str.strip('[]\'') 删除它们。
  • 函数返回的字符串中存在“[]”是由于您在数组上调用了str()。在fileMatched[0] 上调用它,以确保返回一个文件名,否则在应用@987654330 后可能会遇到字符串看起来像“.\common\bounding_box_limits.csv,.\common\bounding_box_limits.2.csv”的问题@.
  • 再次感谢!我不认为我可以使用该索引,因为我认为它可能会在找到第一个文件匹配项之前生成一堆空单元格(我仍在弄清楚 Python 迭代器的行为)。为了妥协,我把 if len(fileMatched) != 0 和 return 放在那个条件语句中;但是,如果我希望函数在第一个结果之后返回,我应该将它缩进到 for 循环内。
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2011-06-05
  • 2010-09-11
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
相关资源
最近更新 更多