python中文件路径如何读取,python获取文件路径的文件名称

  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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: