Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python XLRD,检查是否有一张纸没有';别再找别的了_Python_Xlrd - Fatal编程技术网

Python XLRD,检查是否有一张纸没有';别再找别的了

Python XLRD,检查是否有一张纸没有';别再找别的了,python,xlrd,Python,Xlrd,正在尝试读入一系列xls文件。它们的格式不统一。有时床单存在,有时不存在。有时他们有一个名字,有时又有另一个。这是一个不完美的世界 我尝试检查工作表名称的一些代码: 导入xlrd wb=xlrd.open_工作簿(r'C:\sample.xls') 课堂练习册和阅读: 定义初始(自我,wb): self.wb=wb self.history=None def采购历史(自身): 如果加载的自工作表(“采购历史记录”)为真: 采购历史记录=wb.sheet\u按名称(“采购历史记录”) self.h

正在尝试读入一系列xls文件。它们的格式不统一。有时床单存在,有时不存在。有时他们有一个名字,有时又有另一个。这是一个不完美的世界

我尝试检查工作表名称的一些代码:

导入xlrd
wb=xlrd.open_工作簿(r'C:\sample.xls')
课堂练习册和阅读:
定义初始(自我,wb):
self.wb=wb
self.history=None
def采购历史(自身):
如果加载的自工作表(“采购历史记录”)为真:
采购历史记录=wb.sheet\u按名称(“采购历史记录”)
self.history=购买历史记录
elif self.wb.sheet_loaded(以前的购买)为真:
采购历史=wb.sheet\u按名称('以前的采购')
self.history=购买历史记录
其他:
通过
我一直收到一个错误:
xlrd.bffh.xlrd错误:没有名为
的工作表。我正在测试一个wb,我知道它没有第一个条件(采购历史记录表),但有另一个条件(以前的采购表)。我做错了什么?

这可能会有帮助

import xlrd

class Workbook_Reading:

    def __init__(self, wb):
        self.history = None
        self.desiredSheetNames = ['Purchase History', 'Previous Purchases']
        self.availableSheetNames = []
        self.wb = xlrd.open_workbook(r'C:\\sample.xls')
        self.set_available_sheets()

    def set_available_sheets(self):
        for sheetName in self.desiredSheetNames:
            try:
                sheet = self.wb.sheet_by_name(sheetName)
                self.availableSheetNames.append(sheetName)
            except:
                pass

    def purch_hist(self):
        if 'Purchase History' in self.availableSheetNames:
            purchase_history = wb.sheet_by_name('Purchase History')
            self.history = purchase_history
        elif 'Previous Purchases') in self.availableSheetNames:
            purchase_history = wb.sheet_by_name('Previous Purchases')
            self.history = purchase_history
        else:
            pass

正如@Jabb在其最初评论中所建议的,正确的方法是尝试/例外。尽管他的示例有点[不必要]过于复杂,例如,不需要创建一个方法来设置可用的工作表,您只需使用
book.sheet_names()
即可(检查是否存在具有给定名称的工作表)。但正如我所说,甚至不需要检查使用if/elif/else块,只需使用try/except

import xlrd

file_name = r'some_path\some_file.xls' # replace with your file

class Workbook_Reader:
    def __init__(self, wb, lookup_sheets=('Purchase History', 'Previous Purchases')):
        self.wb = xlrd.open_workbook(wb)
        self.lookup_sheets = lookup_sheets

    @property
    def purchase_history(self): # this property will return the respective sheet or None
        for sheet_name in self.lookup_sheets:
            try:
                return self.wb.sheet_by_name(sheet_name)
            except xlrd.biffh.XLRDError:
                pass

foo = Workbook_Reader(file_name)
for row in foo.purchase_history.get_rows():
    for cl in row:
        print(cl.value)

请注意,在查找表上迭代时,
第一次看到的wins

即使在您编辑了原始post
self.wb
之后也会引发
AttributeError:“工作簿读取”对象没有属性“wb”
,因为您的类没有wb属性。i、 e.如果您得到的是
xlrd.bffh.XLRDError:No Sheet
,则这不是实际的代码。因此
c:sample.xls
缺少齿隙,将首先引发FileNotFoundError。创建一个Sheet name列表,然后在try/catch块中使用Sheet_by_name()函数对其进行迭代。抱歉,我很快就完成了示例代码。它有一个self.wb和一个C:\。我会在@Jabb中编辑这些,但我会尝试这样做。谢谢!我要试一试。