【问题标题】:Using raw literal representations when working with variable strings处理变量字符串时使用原始文字表示
【发布时间】:2013-12-14 23:20:31
【问题描述】:

我正在尝试使用 for 循环将不同源文件夹中的文件复制到同一个目标文件夹中。我喜欢使用文字表示来避免文件路径中出现多个反斜杠的问题。我找不到正确的方法来获得变量的文字表示。任何提示将不胜感激。代码如下:

import shutil
destination_folder=DF

for i in range (1,3):
    new_folder='folder_'+str(i)
    new_path=os.path.join('C:\foo', new_folder, file_to_copy)
    source_file= r(new_path)                #WRONG
    destination= r(destination_folder)      #WRONG
    shutil.copy(source_file, destination)

【问题讨论】:

  • 我认为您的代码中的意思是r'C:\data',不是吗?
  • 今天的禅意时刻:变量已经包含了它们的内容。
  • 应该是 r'C:\data\folder_1\file_to_copy'
  • 附带说明,C:\data 是一个不好使用的示例,因为无论是否使用原始字符串文字,它的工作方式都相同,因为 \d 不是 Python 转义序列。请改用C:\fooC:\noway
  • 用 C:\foo 更正

标签: python string-literals


【解决方案1】:

r 不是一个适用于字符串对象的函数,它是一个适用于字符串文字的修饰符。它改变了文字如何被解释为一个值。但是一旦完成,该值只是一个普通的旧字符串值。特别是:

>>> a = '\n'
>>> b = '''
... '''
>>> a == b
True

那么,如果ab 是相同的值,Python 怎么可能知道你想把它变成r'\n'

就此而言,想象一下:

>>> c = sys.stdin.readline()

>>> c == a
True

或者这个:

>>> d = chr(10)
>>> d == a

在任何其他情况下,您都不能返回并将字符串文字重新解释为原始字符串 - 在 b 中它将保持不变,而在 cd 中则没有字符串文字首先。


如果你想转义字符串值中的所有个特殊字符,而不关心它们来自哪里,你可以通过让 Python 转义字符串来做到这一点。例如:

>>> e = a.encode('unicode-escape').decode('ascii')

但您绝对不想这样做来构造文件名以传递给shutil.copy 函数。


如果您的代码中有字符串文字,并且您希望将其视为原始字符串文字,只需将其写为原始字符串文字即可。所以:

new_path=os.path.join(r'C:\foo', new_folder, file_to_copy)
source_file= new_path
destination= destination_folder

您可以改为手动转义文字中的反斜杠,或使用正斜杠代替反斜杠等。但这些都是您在 Python 评估文字之前对文字所做的所有操作,而不是 到字符串事后。

【讨论】:

  • 感谢您的解释。但是,上面的代码并不能解决我的问题。当我正在解决这个问题时,我突然想到,我真正的问题可能不是 r (此时看起来我走错了路),而是 shutil.copy 命令。它一直给我一条错误消息,因为它找不到文件(因为我在上面创建的文件路径中插入了双反斜杠)。任何提示将不胜感激。
  • @user1609104:我怀疑文件路径中没有插入双反斜杠,并且您实际上只是将字符串的 repr 与字符串本身混淆(以同样的方式您最初将字符串文字与字符串本身混淆)。但是如果没有看到你运行的实际代码和你看到的导致你得出这个结论的输出,我只能猜测。
  • 谢谢,通过这次谈话我解决了这个问题。我这样做的方式只是将 fwd 斜杠转换为反斜杠,并像在代码的初始版本中一样继续使用 shutil.copy 命令。对我有用的是: import shutil destination_folder=DF for i in range (1,3): new_folder='folder_'+str(i) new_path=os.path.join(r'C:/foo', new_folder , file_to_copy) source_file=source_path source_file=source_file.replace('\\','/') shutil.copy(source_file, destination)
【解决方案2】:

变量字符串的“文字表示”的概念并没有真正的意义。

如果您有一个名为new_path 的变量,则该变量的值只是一个字符串值。 r 前缀仅适用于字符串文字。

【讨论】:

  • 我的问题是,如果我不使用文字,那么 shutil.copy 命令会给我带来问题,因为它会在文件路径中添加反斜杠。
  • @user1609104:不,它没有。
  • 当我使用之前代码中写的shutil.copy命令时(即shutil.copy(source_file,destination),我得到一个错误信息(IOError: [Errno 22] invalid mode ('rb ') 或文件名:...) 并且文件路径的名称包含双反斜杠
  • 啊,您看到的是双反斜杠,因为这是 Python 打印输出的方式。在 Python shell 中键入 r'\n'。它将以'\\n' 响应但取该字符串的长度。它是 2,而不是 3。它从未添加反斜杠;它只是以双反斜杠的形式向您显示结果。
猜你喜欢
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2022-10-15
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
相关资源
最近更新 更多