我正在尝试使用pyqt5和pandas编写GUI程序来选择文件夹,从文件夹中读取所有html文件将其合并到一个pandas数据框中并输出excel文件。
我已经编写了代码,并且在从代码所在的同一目录中选择文件时工作正常。
唯一的问题是,如果我从其他目录中选择文件,则会发出“No table found”错误。
请检查下面的错误代码
Traceback (most recent call last):
File "C:\Users\prince\Desktop\Gui\final\UI.py", line 69, in go
df = pd.read_html(file)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\html.py", line 906, in read_html
keep_default_na=keep_default_na)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\html.py", line 743, in _parse
raise_with_traceback(retained)
File "C:\ProgramData\Anaconda3\lib\site-packages\pandas\compat\__init__.py", line 344, in raise_with_traceback
raise exc.with_traceback(traceback)
ValueError: No tables found
[Finished in 17.8s with exit code 1]
PFB代码
import sys
import os
from bs4 import BeautifulSoup
import pandas as pd
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import QApplication, QWidget, QInputDialog, QLineEdit, QFileDialog
from PyQt5.QtGui import QIcon
class Window(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.init_ui(self)
def init_ui(self,Consolidate):
Consolidate.setObjectName("Consolidate")
Consolidate.resize(410, 300)
self.progressBar = QtWidgets.QProgressBar(Consolidate)
self.progressBar.setGeometry(QtCore.QRect(20, 220, 381, 23))
self.progressBar.setProperty("value", 0)
self.progressBar.setObjectName("progressBar")
self.pushButton = QtWidgets.QPushButton(Consolidate)
self.pushButton.setGeometry(QtCore.QRect(320, 30, 51, 21))
self.pushButton.setObjectName("browse")
self.lineEdit = QtWidgets.QLineEdit(Consolidate)
self.lineEdit.setGeometry(QtCore.QRect(20, 30, 291, 21))
self.lineEdit.setObjectName("lineEdit")
self.pushButton_2 = QtWidgets.QPushButton(Consolidate)
self.pushButton_2.setGeometry(QtCore.QRect(140, 250, 131, 41))
self.pushButton_2.setObjectName("go")
self.textBrowser_2 = QtWidgets.QTextEdit(Consolidate)
self.textBrowser_2.setGeometry(QtCore.QRect(20, 70, 351, 141))
self.textBrowser_2.setObjectName("textBrowser_2")
self.retranslateUi(Consolidate)
QtCore.QMetaObject.connectSlotsByName(Consolidate)
def retranslateUi(self, Consolidate):
_translate = QtCore.QCoreApplication.translate
Consolidate.setWindowTitle(_translate("Consolidate", "Consolidate Excel"))
self.pushButton.setText(_translate("Consolidate", "Browse"))
self.lineEdit.setPlaceholderText(_translate("Consolidate", "Please Browse The Target Folder"))
self.pushButton_2.setText(_translate("Consolidate", "Go"))
self.pushButton.clicked.connect(self.fname)
self.pushButton_2.clicked.connect(self.go)
folder = str()
def fname(self):
global folder
file = str(QFileDialog.getExistingDirectory(self, "Select Folder"))
folder = (file)
print (folder)
self.lineEdit.setText(folder)
def go(self):
import pandas as pd
dflist = list()
fnames = (os.listdir(folder))
counter = 0
for file in fnames:
if file == "Consolidate.py" or file == "QtoolAssigned.xlsx":
continue
else:
print(file)
print(folder)
df = pd.read_html(file)
self.textBrowser_2.append(file[7:-28])
df = pd.read_html(file)
df = df[0].dropna(axis=0, thresh=4)
df['Team Name'] = str(file[7:-28])
dflist.append(df)
concatdf = pd.concat(dflist,axis=0)
concatdf.to_excel(folder+'\\'+'QtoolAssigned.xlsx', index=None)
if __name__=='__main__':
app = QtWidgets.QApplication(sys.argv)
ex = Window()
ex.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
问题是因为您需要传递文件的完整路径,因为您只传递文件的名称,然后pandas将在执行GUI的文件夹中查找它,解决方案是传递完整我们使用os.path.join()
def go(self):
import pandas as pd
dflist = list()
fnames = (os.listdir(folder))
counter = 0
for file in fnames:
if file not in ["Consolidate.py", "QtoolAssigned.xlsx"]:
print(file)
print(folder)
df = pd.read_html(os.path.join(folder, file))
self.textBrowser_2.append(file[7:-28])
df = df[0].dropna(axis=0, thresh=4)
df['Team Name'] = str(file[7:-28])
dflist.append(df)
concatdf = pd.concat(dflist,axis=0)
concatdf.to_excel(os.path.join(folder, 'QtoolAssigned.xlsx'), index=None)