2014-01-16 16 views
0

我是Python的新手 - 但不是編程,也是一個陡峭的學習曲線。用於文件名的字符串文字

我有一個程序讀取幾個輸入文件 - 第一個輸入文件包含(其中包括)路徑和其他文件的名稱。

我可以打開文件並讀取名稱確定。如果我打印字符串,它看起來像這樣

Z:\ \蟒蛇\ \ rb_data.dat \ n」

我所有的‘\’變成了‘\ \’我想我可以通過解決這個問題的「 r「前綴將其轉換爲文字。

我的問題是如何將前綴附加到字符串變量?

這就是我想做的事:

modat = open('z:\\python\mot1 input.txt') # first input file containing names of other file 

rbfile = modat.readline() # get new file name 

rbdat = open(rbfile) # open new file 
+0

這裏有什麼麻煩? 「\\」可以用於路徑.... – Netwave

回答

0

在Python中的反斜線\(!和StackOverflow上的代碼塊)表示,有效,「區別對待下一個字符」。由於它被保留用於此目的,當你真正反斜槓在你的字符串,它必須是「逃脫」,由前一個反斜槓:

>>> myString = "\\" # the first one "escapes" the second 

>>> myString = "\" # no escape, so... 
SyntaxError: EOL while scanning string literal 

>>> print("\\") # when we actually print out the string 
\ 

簡短的故事,你基本上可以忽略這個你字符串。如果你通過rbfileopen,Python會正確解釋它。

0

\\是一個轉義序列爲反斜線字符\。當你指定一個字符串文字時,它們被'"加上引號。由於您可能需要指定某些字符作爲不能像這樣輸入的字符串的一部分,例如引號本身 - 轉義序列允許您這樣做。他們通常是\x其中x是你想要輸入的東西。現在因爲所有的轉義序列都以反斜槓開始,所以反斜槓本身也變成了一個特殊的字符,你不能直接在字符串中指定。所以你也需要逃避它。

這意味着字符串字面值'\\'實際上代表了一個帶單個字符的字符串:反斜槓。原始字符串,即在開頭引號字符前帶有r的字符串文本,忽略(大部分)轉義序列。所以r'\\x'實際上是其中兩個反斜槓後面跟着x的字符串。所以它與由非原始字符串文字'\\\\x'描述的字符串相同。

儘管這隻適用於字符串文字。該字符串本身不包含關於它是否使用原始字符串文字創建的信息,或者是否存在某種轉義序列需要。它只包含所有的字符串。

這也意味着只要你從某個地方得到一個字符串,例如通過從一個文件中讀取它,那麼你就不必擔心在那裏轉義某些東西,以確保它是一個正確的字符串。它只是。

因此,在您的代碼中,當您打開文件z:\python\mot1 input.txt時,您需要首先將該文件名指定爲字符串。所以你必須使用字符串文字,或者使用反斜線或者使用原始字符串。

然後,當你從那個文件中讀取新的文件名時,你已經有了一個真正的字符串,並且不需要更多的麻煩。假設它被正確地寫入文件,你可以像這樣使用它。

+0

感謝您的支持 - 這是poke的評論「假設它正確地寫入文件」讓我想到了。如果我沒有錯誤地輸入文件名 - 它會一切正常 - 錯字,這是一個笨蛋! – user3202419

0

爲什麼不使用os.path.normcase,像這樣:

with open(r'z:\python\mot1 input.txt') as f: 
    for line in f: 
     if line.strip(): 
     if os.path.isfile(os.path.normcase(line.strip())): 
       with open(line.strip()) as f2: 
        # do something with 
        # f2 

os.path.normcase文檔:

規範化路徑名的情況。在Unix和Mac OS X上,這返回 路徑不變;在不區分大小寫的文件系統中,它將 路徑轉換爲小寫。 在Windows上,它也將正斜槓轉換爲 反斜槓。