IndexError:从CSV文件阅读时必须至少有一个工作表可见

whitzsjs  于 2023-07-31  发布在  其他
关注(0)|答案(2)|浏览(446)

我有一个CSV文件,看起来像这样:

first-name,last-name,email-address
Yes,Beth,bethfat@gmail.com
Iran,Dajango,django@me.com
Paul,Walker,info@walker.com
Ray,Johnson,JJRay@gmail.com

字符串
我正在尝试使用Pandas将此CSV文件转换为Excel文件以供进一步使用。我是通过从网页上阅读数据来做到这一点的:

import requests

def get_data(url):
    headers = {
        "Connection": "close",
        "User-Agent": "TBG/Converter (TBG;file-converter)"
    }
    req = requests.get(url, headers=headers)
    return req.content

def parse_html(html):
    retval = {}
    data = html.split("</head>")
    data = data[-1]
    data = data.split("\n")
    retval["header"] = data[0].strip()
    data = data[1:-1]
    emails = set()
    for email in data:
        emails.add(email.split("<br>")[-1])
    retval["userInformation"] = list(emails)
    return retval


并将其写入临时CSV文件:

import pandas as pd

def write_to_xlsx(data_dict, filename):
    tmp_filename = "/tmp/{}.csv".format(rand())
    with open(tmp_filename, "a+") as tmp:
        data = [data_dict["header"]]
        for item in data_dict["userInformation"]:
            item = item.split(",")
            item = ",".join([c.strip() for c in item])
            data.append(item)
        csv_format = "\n".join(data)
        tmp.write(csv_format)
    print tmp_filename
    with pd.ExcelWriter(filename) as ew:
        pd.read_csv(tmp_filename).to_excel(
            ew, index=False, sheet_name=tmp_filename.split(".")[0], encoding="utf-8"
        )
        ew.save()


在编写Excel文件的过程中,我收到一个错误,告诉我:

Traceback (most recent call last):
  File "converter.py", line 70, in <module>
    write_to_xlsx(sorted_data, config["filename"].format(str(datetime.datetime.now()).split(" ")[0]))
  File "converter.py", line 63, in write_to_xlsx
    ew.save()
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/pandas/io/excel.py", line 985, in __exit__
    self.close()
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/pandas/io/excel.py", line 989, in close
    return self.save()
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/pandas/io/excel.py", line 1018, in save
    return self.book.save(self.path)
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/workbook/workbook.py", line 367, in save
    save_workbook(self, filename)
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/writer/excel.py", line 284, in save_workbook
    writer.save(filename)
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/writer/excel.py", line 266, in save
    self.write_data()
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/writer/excel.py", line 95, in write_data
    archive.writestr(ARC_WORKBOOK, write_workbook(self.workbook))
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/writer/workbook.py", line 94, in write_workbook
    active = get_active_sheet(wb)
  File "/Users/admin/bin/python/printers/venv/mailchimper/lib/python2.7/site-packages/openpyxl/writer/workbook.py", line 61, in get_active_sheet
    raise IndexError("At least one sheet must be visible")
IndexError: At least one sheet must be visible


是什么导致了这个问题,我如何解决它?

3ks5zfa0

3ks5zfa01#

我也有同样的问题。就像错误说的,引擎创建了一个新的excel文件,其中没有任何工作表,所以有时它看起来损坏了。我调试了我所有的代码,并注解了几乎所有的东西,试图理解这个问题。有时候,当“作家”试图找到纸张时,就会发生这种情况。有时,在创建文件并将数据框转换为图纸本身时,它只是正常工作。所以,为了避免这种行为,在Stack Overflow中找到了解决方案。
解决方案的链接:IndexError: At least one sheet must be visible
效果不错。唯一困扰我的是创建一个空白表,以确保文件不被损坏。所以,我所做的是,如果文件有这个“工作表”,也有多个工作表,删除它。

wb=openpyxl.load_workbook('the_file.xlsx')
sheets = wb.sheetnames
name = 'Sheet'
if name in sheets and len(sheets)>1:
    wb.remove(wb[name])
    wb.save('the_file.xlsx')

字符串
对于什么需要的建议,是好的,但我会看更多,如果我可以做这种删除在创建,或保存文件时,以避免再次加载它。更优雅的解决方案。
如果我找到(或任何人),我们可以在这里张贴。:)

qlfbtfca

qlfbtfca2#

TheBasalt的答案有一个合理的解释,但他的链接中的解决方案对我不起作用。
如果创建一个新的Excel文件不工作与上述错误消息,似乎我们正在试图创建一个损坏的文件没有工作表。
然后,我们的计划B是追加到一个有效的、空的Excel文件。空的,但只有一张纸。这一个工作表没有数据,所以对于我们的目的,这个文件是 * 空 *。
创建此类空文件的最简单方法是使用Windows文件资源管理器,并使用鼠标右键上的上下文菜单选择新建,Microsoft Excel工作表。
然后,将您的python代码append更改为以下空文件:

pd.ExcelWriter(file_name, mode = 'a') as writer:

字符串
如果你想在python中完成这一切,你可以保存这个空文件一次,然后使用python代码将其复制到你的“新”空Excel文件中。

相关问题