2014-10-28 236 views
1

我试图分裂的路径来获取文件,该字符串的最后部分的名称拆分一个字符串,我处理,我不能够解决一个问题:反斜杠

我的字符串:te = 'C:\Users\Desktop\TEST\Excel_Reports\1837.xlsx'

我已经这样做了:

>>> te.split('\\') 
['C:', 'Users', 'Desktop', 'TEST', 'Excel_Reports\x01837.xlsx'] 

>>> te.split('\\')[-1] 
'Excel_Reports\x01837.xlsx' 

我不知道什么是\0\number这个问题....是它的任何特殊字符的Python?

这里是我想获得:

['C:', 'Users', 'Desktop', 'TEST', 'Excel_Reports', '1837.xlsx'] 

但我不能得到完全此。

PD:不是一个像file_name = te [-5:-1]这样的有效解决方案,因为excel文件的名称可以在任何时候都不同,但始终是数字。

编辑:显示我如何得到te

folder = QtGui.QFileDialog.getExistingDirectory(None, "Load excel") 

for f in os.listdir(folder): 
    if f.endswith(".xlsx"): 
     te= os.path.join(str(folder),str(f)) 
     #bla, bla, bla,...... 

编辑:

感谢所有的答案和意见,他们指出我在正确的方向。

不过,我解决了这个问题,只是通过更换这行:

te= os.path.join(str(folder),str(f)) 

这一个:

te = os.path.join(folder,f) 

然后,这个工程:

te.split('\\')[-1].split('.')[0] 

的名字命名(数量)没有扩展名的文件xlsx

+2

您应该使用原料字符串'r'...''在处理\时可以转义某些字符,例如'\ n'是“新行”。 – Ffisegydd 2014-10-28 09:44:20

+1

你知道正斜杠在窗口中正常工作,并回避这些问题。 – 2014-10-28 09:45:20

+0

谢谢Ffisegydd ......我不知道你的意思是“原始弦”......但我会调查。感谢您指出 – codeKiller 2014-10-28 09:47:24

回答

3

你需要做字面te原始字符串

>>> te = r'C:\Users\Desktop\TEST\Excel_Reports\1837.xlsx' 
>>> import os 
>>> te.split("\\") # can't use os.path.sep as my repl is on linux 
['C:', 'Users', 'Desktop', 'TEST', 'Excel_Reports', '1837.xlsx'] 

这是由于语法蟒蛇文字字符串。 \g\n,\t等也会导致问题。其他斜线不需要需要以逃脱,因为下面的字符不是有效的转义序列 - 但它是混乱的地狱。更好地使用原始字符串语法

如果您从源文件(例如ini文件或数据库(如您应该))以外的地方获得te,则甚至不会看到此问题。

+0

感谢您的回答和解释! – codeKiller 2014-10-28 10:16:15

+0

你可以使用'ntpath'来操作Linux上的windows路径;) – 2014-10-28 10:58:17

4

假设你有一个正确路径,则:

import os 

# Note that we're using the **r** prefix to make it a raw string - backslashes don't escape 
path = r'C:\Users\Desktop\TEST\Excel_Reports\1837.xlsx' 
print os.path.split(path)[1] 
# 1837.xlsx 

你还可以再进一步分裂只得到文件名的基础上,如:

print os.path.splitext(os.path.split(path)[1])[0] 
# 1837 
+0

感谢Jon的答案! – codeKiller 2014-10-28 10:17:27

1

你能避免str.split完全只使用os.path功能:

te = r'C:\Users\Desktop\TEST\Excel_Reports\1837.xlsx' 
print os.path.splitext(os.path.basename(te))[0] 

如果在事先知道你解析Windows路径,它最好用npath - os.path模块的窗户气息,让你的代码,它是即使在Linux上运行的工作:

print ntpath.splitext(ntpath.basename(te))[0]