【问题标题】:How do I make the string a raw string literal so that I can run cv2.imread() on it?如何使字符串成为原始字符串文字,以便可以在其上运行 cv2.imread()?
【发布时间】:2018-12-21 06:50:34
【问题描述】:
one = (r"C:\Users\Sam\OneDrive\Desktop\RateData\1")

for feature in features[0]:
    backslash = '\\'
    imagePath = ((one)+backslash+"'"+str(feature)+"'")
    img = cv2.imread(imagePath)
    print(imagePath)
    print(img)

所以print(imagePath) 的结果是: C:\Users\Sam\OneDrive\Desktop\RateData\1\'1.1.jpg'


print(img) 的结果是:None


feature 只是图像文件名。我是这样写的,所以它会将唯一的图像文件名添加到路径中。

所以我尝试通过cv2.imread() 函数运行它,它返回None。 我知道它无法运行的原因是它只是将其作为字符串读取,并且没有将其识别为原始字符串文字。我不是一个非常有经验的程序员,所以我尝试了所有我能想到的方法(不是很多)让它将路径作为原始字符串文字读取,但它不起作用。因此,如果你们中的任何人都可以帮助我将字符串变成那样,那就太棒了!

感谢您的帮助!

【问题讨论】:

  • “我知道它无法运行的原因是它只是将它作为字符串读取并且不将其识别为文字” - 无论您对“字符串”和“文字”的概念如何" 是,它们与 Python 的实际工作方式不匹配。您为什么要尝试将单引号粘贴到文件路径中?你的文件名中真的有那些单引号吗?
  • 是您构建路径C:\Users\Sam\OneDrive\Desktop\RateData\1\'1.1.jpg 但想要构建不同路径的问题,还是您构建该路径并想要构建该路径但不明白为什么没有名为@ 的文件987654330@ 在那个RateData 目录中?
  • 要回答你的两个 cmets,C:\Users\Sam\OneDrive\Desktop\RateData\1\'1.1.jpg 是可接受的路径,如果我输入:r"C:\Users\Sam\OneDrive\Desktop\RateData\1\'1.1.jpg'",我已经让它在代码中工作。它的工作原理与:r"C:\Users\Sam\OneDrive\Desktop\RateData\1\1.1.jpg" 相同。我需要路径前面的“r”的原因是我不会收到 unicode 错误。另外,我使用“字面”这个词是我的错。我应该使用“原始字符串”。我发帖的原因是想弄清楚如何将imagePath 变成一个原始字符串,但事实证明我不需要那个。

标签: python string opencv literals cv2


【解决方案1】:

所以 "print(imagePath) 的结果是:C:\Users\Sam\OneDrive\Desktop\RateData\1\'1.1.jpg

几乎可以肯定,RateData 目录中没有名为 '1.1.jpg 的文件。虽然 Windows 确实允许在文件名中使用撇号/单引号字符,但我无法想象您会故意在其中使用一个。那么,它可能被命名为1.1.jpg

我也不确定你是如何从那个代码中得到那个字符串的……但没关系。


你让这一切变得比原来要困难得多。无需担心路径分隔符会被转义和正确引用,或者您尝试做的任何事情。

Python 带有os.path 模块,用于执行与路径相关的操作。所以就用它吧:

for feature in features[0]:
    imagePath = os.path.join(one, str(feature))
    img = cv2.imread(imagePath)
    print(imagePath)
    print(img)

或者,既然我打赌 feature 已经是一个字符串,那就更简单了:

    imagePath = os.path.join(one, feature)

或者,如果您更喜欢面向对象的 API,Python 还附带了pathlib

one = pathlib.Path(one)
for feature in features[0]:
    imagePath = one / feature
    img = cv2.imread(str(imagePath))
    print(imagePath)
    print(img)

我不知道cv2 是否支持pathlib,但如果是,您可以直接使用cv2.imread(imagePath)。 (如果你想使用pathlib,一定要试试看,因为它显然更具可读性。)

【讨论】:

  • 为了解释我想要做的是,我试图拼凑一个字符串来为文件创建路径。在您回复之前,我不知道 os.path.join 。另外,如果您阅读了我的其他评论,您就会明白为什么我使用'1.1.jpg' 而不仅仅是1.1.jpg,这仅仅是因为我知道它以第一种方式有效,而我没有费心尝试另一种方式。您的回答是比我尝试做的更好的解决方案,并且确实效果很好。出于好奇,我仍然想知道如何使该字符串成为原始字符串,因为这也可以。谢谢!
  • @SamHall 您不能“使字符串成为原始字符串”。原始字符串不是一回事。字符串只包含它们的字符。原始字符串 literals 是在源代码中表示字符串的一种方式。它们会影响您的源代码的解析方式,但一旦解析,您得到的字符串只是一个普通的旧字符串,例如,r'C:\Spam''C:\\Spam' 是完全相同的字符串。因此,您尝试做的事情没有意义,因此无法解决您的问题。
  • 因此,我没有使用我尝试使用的那种愚蠢的串联,而是输入了完整路径:r"C:\Users\fatso\OneDrive\Desktop\RateData\1\1.1.jpg" 并将其设置为等于imagePath。我只是明白路径前面的r 使它起作用,所以当我问这个时,我只是想找到一种方法使我的连接成为原始字符串文字,即使我没有意识到它被称为原始字符串字符串字面量。但无论如何,您是说不可能将这种连接变成原始字符串文字?
  • @SamHall 我是说它没有意味着任何东西。如果你连接r"C:\Users\fatso\OneDrive\Desktop\RateData\1" + "\\" + "1.1.jpg",你得到的是和r"C:\Users\fatso\OneDrive\Desktop\RateData\1\1.1.jpg"`相同的字符串。
  • 另外我对stackoverflow有点陌生,所以我想知道,是否可以给我一些建议,让我写一个好问题,因为我不想被禁止提问?我是一个相对较新的程序员,当我处理更复杂的事情时,提出问题会很有帮助,我不希望这种特权被剥夺。如果你愿意,你能告诉我这篇文章有什么问题,以便我能做得更好吗?我已经阅读了指导方针,我以为我是绿色的,但显然不是。如果您没有时间,我理解,但无论如何感谢您花时间帮助我!
猜你喜欢
  • 1970-01-01
  • 2020-07-12
  • 2021-01-06
  • 2018-05-09
  • 2014-05-05
  • 1970-01-01
  • 2013-06-10
  • 2021-07-21
  • 1970-01-01
相关资源
最近更新 更多