python - 获取所选文件的完整路径
问题描述
我有一个文件夹中的树状结构,我想在单击一个文件时打开该文件。
一切正常,但是当我单击文件时,它不会向我发送正确的路径
import os
import platform
import subprocess
import tkinter as tk
import tkinter.ttk as ttk
class App(tk.Frame):
def openfolderfile(self,filename2open):
if platform.system() == "Windows":
os.startfile(filename2open)
elif platform.system() == "Darwin":
subprocess.Popen(["open", filename2open])
else:
subprocess.Popen(["xdg-open", filename2open])
def select(self):
for i in self.tree.selection():
print("".join([str(self.tree.item(i)['text'])]))
print(os.path.abspath("".join([str(self.tree.item(i)['text'])])))
# self.openfolderfile()
def __init__(self, master, path):
tk.Frame.__init__(self, master)
self.tree = ttk.Treeview(self)
ysb = ttk.Scrollbar(self, orient='vertical', command=self.tree.yview)
xsb = ttk.Scrollbar(self, orient='horizontal', command=self.tree.xview)
self.tree.configure(yscroll=ysb.set, xscroll=xsb.set)
self.tree.heading('#0', text=path, anchor='w')
abspath = os.path.abspath(path)
root_node = self.tree.insert('', 'end', text=abspath, open=True)
self.process_directory(root_node, abspath)
self.tree.grid(row=0, column=0,ipady=200,ipadx=200)
ysb.grid(row=0, column=1, sticky='ns')
xsb.grid(row=1, column=0, sticky='ew')
self.grid()
self.tree.bind("<Double-Button>", lambda e: self.select())
def process_directory(self, parent, path):
for p in os.listdir(path):
abspath = os.path.join(path, p)
isdir = os.path.isdir(abspath)
oid = self.tree.insert(parent, 'end', text=p, open=False)
if isdir:
self.process_directory(oid, abspath)
root = tk.Tk()
w, h = root.winfo_screenwidth(), root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (w, h))
root.title("Success ")
app = App(root, path="Reports/")
app.mainloop()
这是它打印的内容:
/Users/myuser/PycharmProjects/OCP/Notas.txt
真正的路径是:
/Users/myuser/PycharmProjects/OCP/Reports/rep1/Notas.txt
为什么会出现这种情况?
解决方案
select
为您的功能尝试这样的操作:
def select(self):
for i in self.tree.selection():
print("".join([str(self.tree.item(i)['text'])]))
full_path = ''
current_iid = i
while True:
# get next parent directory
parent_iid = self.tree.parent(current_iid)
attach_path = self.tree.item(parent_iid)['text']
# change the parent identifier to be the current now
current_iid = parent_iid
# break if the path is empty and thus no more parents are available
if attach_path == '':
break
# add found path to the full path
full_path = os.path.join(attach_path, full_path)
print(os.path.join(full_path, ("".join([str(self.tree.item(i)['text'])]))))
您的实现的问题是,您使用的是os.path.abspath
,这为您提供了当前工作目录,而不是所选文件所在的目录。
推荐阅读
- javascript - Docusign ifra 完成事件捕获
- php - Laravel 查询/访问数据库信息
- python - discord.py 中的歌词命令
- r - 是否有 R 代码用 0 替换空单元格,但保留填充单元格的原始值?
- android - Android DataBinding / BindingAdapter 错误:{缺少返回语句}
- amazon-s3 - 在 S3 中的现有 ORC 文件上使用 Presto
- json - 将 CityGML 模型转换为 CityJson 文件
- firebase - 如何更改firebase颤动中数组字段的值?
- java - org.springframework.beans.factory.UnsatisfiedDependencyException Springboot
- java - Vaadin 7 中的外部脚本 (CORS) 问题