簡體   English   中英

逃脫Windows的路徑分隔符

[英]Escape Windows's Path Delimiter

我需要通過轉義Windows路徑分隔符來更改此字符串。 我自己沒有定義原始字符串,因此無法在原始字符串'r'之前加上前綴。

我需要這個:

s = 'C:\foo\bar'

是這樣的:

s = 'C:\\foo\\bar'

我在這里和其他地方都能找到的一切都說明了這一點:

s.replace( r'\\', r'\\\\' )

(為什么我必須對我無法想象的原始字符串中的字符進行轉義)

但是打印字符串會導致這種情況。 顯然,已決定重新解釋修改后的字符串中的轉義符:

C:♀oar

在Perl中,這將是如此簡單。 如何在Python中解決此問題?

經過一堆來回的提問,實際的問題是這樣的:

您有一個文件,其內容如下:

C:\foo\bar
C:\spam\eggs

您想讀取該文件的內容,並將其用作路徑名,並且想知道如何轉義。

答案是您根本不需要做任何事情。

反斜杠序列以字符串文字形式處理,而不是從文件或input (在3.x;在2.x中為raw_input )中讀取的字符串對象中進行處理,因此,您無需轉義那些反斜杠序列。

如果您考慮一下,則無需在字符串周圍添加引號即可將其轉換為字符串。 這是完全一樣的情況。 引號和轉義的反斜杠都是字符串表示形式的一部分 ,而不是字符串本身。


換句話說,如果將示例文件另存為paths.txt ,然后運行以下代碼:

with open('paths.txt') as f:
    file_paths = [line.strip() for line in f]
literal_paths = [r'C:\foo\bar', r'C:\spam\eggs']
print(file_paths == literal_paths)

…它將打印出True


當然,如果您的文件生成不正確並且充滿了這樣的垃圾:

C:♀oar

然后就沒有辦法“轉義反斜杠”,因為它們無法逃脫。 您可以嘗試編寫啟發式代碼來重建 應該存在的原始數據,但這是您能做到的最好的。

例如,您可以執行以下操作:

backslash_map = { '\a': r'\a', '\b': r'\b', '\f': r'\f', 
                  '\n': r'\n', '\r': r'\r', '\t': r'\t', '\v': r'\v' }
def reconstruct_broken_string(s):
    for key, value in backslash_map.items():
        s = s.replace(key, value)
    return s

但是,如果要撤消十六進制,八進制或Unicode轉義序列,這將無濟於事。 例如, 'C:\\foo\\x02''C:\\foo\\b'都表示完全相同的字符串,因此,如果您獲得該字符串,則無法知道應該轉換為哪個字符串。 這就是為什么您能做的最好的就是啟發式。

不要做s.replace(anything) 只需在字符串文字前的右引號前加上一個r ,就可以得到一個原始字符串。 任何基於字符串替換的東西都將是一個可怕的麻煩,因為s中實際上沒有反斜杠。 您的代碼中包含反斜杠,但在實際的字符串中不會變成反斜杠。

如果字符串中確實包含反斜杠,並且您希望該字符串在曾經有一個的地方都帶有兩個反斜杠,那么您需要這樣做:

s = s.replace('\\', r'\\')

那將用兩個反斜杠替換任何單個反斜杠。 但是,如果字符串在字面上以s = 'C:\\foo\\bar'出現在源代碼中,則唯一合理的解決方案是更改該行。 它已損壞,您對其余代碼所做的任何操作都不會使其損壞。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM