python中文件路径如何读取,python获取文件路径的文件名称
我从开学就开始用健忘冰棍做PyQt5项目,学到了很多。自从上次项目打包遇到了资源文件处理的问题,Qt提供的qrc资源文件方案慢慢引入到项目中。
在最近对pyside 2(Qt对Python的官方绑定)的系统学习中,其官方教程中有一个数据可视化工具教程的数据可视化教程。在本教程中,pandas库用于读取本地CSV文件。教程本身提供了从相对路径读取文件的方法,但是我想用qrc资源文件来介绍这个CSV文件来培养我的习惯。没想到遇到了熊猫无法读取CSV文件的错误,在解决的过程中对qrc资源文件的操作方式有了更深入的了解。
问题重现
首先,我的项目目录结构是
d:
DataVisualization
main.py
layouts
main.ui
resources
全天. csv
data.qrc
data_rc.py
data.qrc代码是
全天. csv
在main.py中,按照正常的相对路径写入方式可以正确打印CSV文件的内容,但是qrc资源文件方式不可行。具体代码是
进口熊猫作为pd
来自PySide2。QtCore导入QFile,QIODevice
导入data visualization . resources . data _ RC
if __name__==__main__ :
data=PD . read _ CSV(:/data/all _ day . CSV )
# data=PD . read _ CSV(r data visualization \ resources \ all _ day . CSV )
打印(数据)
运行这个main.py会给出错误FileNotFoundError,而使用注释中的语句可以正常显示CSV文件内容。
FileNotFoundError: [Errno 2]文件b:/data/all_day.csv 不存在:b:/data/all_day.csv
解决办法
很久以后,Google终于从堆栈溢出中找到了解决方案和原因。
总之就是因为,作为Qt内部的资源管理方案,只有Qt自己知道如何正确的从资源文件中获取所需文件的正确路径并读取,而外部库甚至python本身都无法获取文件的具体路径。
既然外界因为找不到文件的具体路径而无法读取信息,那么解决方法很明显:跳过路径,让Qt程序直接告诉第三方库所需文件的内容。
导入io
进口熊猫作为pd
来自PySide2。QtCore导入QFile,QIODevice
导入data visualization . resources . data _ RC
if __name__==__main__ :
file=QFile(:/data/all_day.csv )
if file.open(QIODevice。只读):
f=io。BytesIO(file.readAll()。data())
data=pd.read_csv(f)
打印(数据)
值得注意的是,这里pandas.read_csv()通过这个方案可行的原因是read_csv()支持传入参数可以是文件路径,也可以是缓冲区。对于其他一些接口,文件路径可能是必需的,但此路径被阻止。
深思
qrc原则
直接结论:qrc文件本身类似于XML格式的文本,记录了它包含的每个文件的路径。重点是在使用rcc/pyrcc5/pyside2-rcc编译这个文件时,程序遍历qrc文件中的每一个文件路径,并将这个文件的二进制内容写入对应的输出文件。
比如本文使用的all_day.csv文件是一个纯文本文件,文件大小为56.4KB;包含文件路径信息的data.qrc文件大小为85字节;pyside2-rcc.exe编译生成的data_rc.py的文件大小为70.7KB,另外我编译完data_rc.py后,即使删除了all_day.csv文件,程序仍然可以正常运行,读取all _ day.csv中的数据,除了pyside2-rcc.exe把all_day.csv的所有信息都写入编译好的data_rc.py中的解释,我实在想不出为什么一个py文件可以达到70.7KB
有了这样的结论,qrc文件的一些相关特征就可以得到很好的解释,比如:
目标程序中所有嵌入的资源文件都是只读的,资源中的文件只有在程序运行时才能被读取和使用。
在mldgs修改了qrc资源文件中包含的任何文件之后,您必须重复add-compile操作以使更改生效。
Qt以外的程序几乎不可能直接从编译后的文件中获取信息,所以需要通过Qt的内部接口读取资源文件的信息。
使用qrc的其他注意事项
为了管理方便,那些需要编译成qrc资源文件的文件最好放在qrc所在的文件夹或者其子文件夹中。
不带前缀,可以用(:file_name )比如file=qfile (:/all _ day.csv )调用程序中同级别的资源文件;可以使用(:path/to/file )比如file=qfile(:/resources/all _ day . CSV )来调用子目录资源文件。
如果是前缀,可以用(:/prefix/file_name )比如file=qfile (:/data/all _ day.csv )调用程序中的对等资源文件;可以用(:/prefix/path/to/file )比如file=qfile(:/data/resources/all _ day . CSV )来调用子目录资源文件。
对于文件大小超过4M的文件,不建议直接编译。相反,使用选项-binary。具体文件见此。另外,Qt的python绑定不支持-binary。
摘要
作为PySide2的初学者,我还有很多东西要学,包括qrc,很多方面的知识我都一知半解。如果大家对qrc有什么好的意见,或者文章有什么错误,希望大家多多交流。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。