我正在尝试在python中使用tkinter在一个简单的GUI应用程序中实现“将文件放在此处”功能
它使用TkinterDnD2,最终看到此stackoverflow answer
删除文件event.data时,将返回用大括号括起来的文件名
示例:{d:/test/sample1.pdf}
但是,当将多个文件放入目标中时,每个路径都用花括号包围
示例:{D:/test/sample1.pdf} {D:/test/sample2.pdf}
如何从该字符串正确解析文件路径?
答案 0 :(得分:1)
我不确定TkinterDnD2库将返回单个字符串中的路径流还是返回字符串中的单个路径。
如果它是字符串中的单个路径,则解决方法很简单:
>>> str1="{mypath/to/file}"
>>> str1[1:-1]
输出应为
'mypath/to/file'
但是我想您的问题是多个路径以单个字符串形式出现。您可以实现以下代码。
将str1视为具有多个路径的字符串:
str1="{mypath1/tofile1}{mypath3/tofile3}{mypath2/tofile2}"
i=0
patharr=[]
while(str1.find('{',i)>=0):
strtIndex=str1.find('{',i)
if(str1.find('}',strtIndex+1)>0):
endIndex=str1.find('}',strtIndex+1)
patharr.append(str1[strtIndex+1:endIndex])
print(str1[strtIndex:endIndex+1])
i=endIndex+1
print(patharr)
现在输出如下:
['mypath1 / tofile1','mypath3 / tofile3','mypath2 / tofile2']
因此,根据您在下面的评论中的问题,是文件路径中带有花括号的文件路径的代码。
str1 = "{mypath}}}}1/tofil{{{e1}{mypath3/tofile3}{mypath2/tofile2}}}}}}"
i = 0
patharr = []
while (str1.find('{', i) >= 0):
strtIndexfirst = str1.find('{', i)
notFound = True
strtIndex = strtIndexfirst
while (notFound and strtIndex < len(str1)):
if (str1.find('}', strtIndex + 1) > 0):
findInd = str1.find('}', strtIndex + 1)
if (findInd == len(str1) - 1):
endIndex = str1.find('}', strtIndex + 1)
patharr.append(str1[strtIndexfirst + 1:endIndex])
print(str1[strtIndex:endIndex + 1])
i = endIndex + 1
break
if (str1[findInd + 1] == '{'):
endIndex = str1.find('}', strtIndex + 1)
patharr.append(str1[strtIndexfirst + 1:endIndex])
print(str1[strtIndex:endIndex + 1])
i = endIndex + 1
notFound = False
else:
strtIndex = findInd
else:
strtIndex = str1.find('}', strtIndex + 1)
print(patharr)
对于上述字符串输出是
['mypath}}}} 1 / tofil {{{e1','mypath3 / tofile3','mypath2 / tofile2}}}}}'')
如果str1是
str1="{{{mypath1/tofil}}e1}{mypath3/tofile3}{mypath2/tofile2}}}}}}"
输出为
['{{mypath1 / tofil}} e1','mypath3 / tofile3','mypath2 / tofile2}}}}}''
也可以解决其他测试用例。这段代码运行良好。
答案 1 :(得分:1)
使用以下两行python代码可以轻松实现:
temp = filePathsReturned[1:-1]
list = temp.split("} {")