首页 > 解决方案 > 从 excel 中读取数据并用新列 PYTHON 重写它

问题描述

我最近设法创建了一个从 excel 读取数据的程序,对其进行编辑并与新列一起重写它,它运行良好,但问题是如果 excel 文件包含 1000 行,它会在不到 2 分钟内完成,但如果它包含 10-15k 行,可能需要 3-4 小时,而且我拥有的行越多,它就越慢,这对我来说没有意义。

我的代码:

从 xls excel 中读取:

 def xls_to_dict(workbook_url):
        workbook_dict = {}
        book = xlrd.open_workbook(workbook_url)
        sheets = book.sheets()
        for sheet in sheets:
            workbook_dict[sheet.name] = {}
            columns = sheet.row_values(0)
            rows = []
            for row_index in range(1, sheet.nrows):
                row = sheet.row_values(row_index)
                rows.append(row)
            return rows
        return workbook_dict

data = xls_to_dict(filename)

用excel写:

rb = open_workbook(filename, formatting_info=True)
r_sheet = rb.sheet_by_index(0)
wb = copy(rb)
w_sheet = wb.get_sheet(0)

我阅读并找到了一个名为 Pandas 的包,它读取 xlsx 并尝试对其进行处理,但未能将 DataFrame 中的数据访问为字典。所以无法编辑它并重写它来比较性能。

我的代码:

fee = pd.read_excel(filename)

我的输入行数据文件是:

ID。姓名。家庭。DOB 国家说明

我的输出文件是:ID。姓名。家庭。DOB 修改国家/地区描述 NATIONALITY

任何建议将被认真考虑。

标签: pythonexcelpandas

解决方案


您可以通过将工作表数据转换为数据框并获取值作为列表来删除对行的迭代。

from openpyxl import load_workbook
from datetime import datetime,timedelta
from dateutil.relativedelta import relativedelta

def xls_to_dict(workbook_url):
    xl = pd.ExcelFile(workbook_url)   
    workbook_dict = {}
    for sheet in xl.sheet_names:      
        df = pd.read_excel(xl, sheet) 
        columns = df.columns          
        rows = df.values.tolist()     
        workbook_dict[sheet] = rows
    return workbook_dict,columns

data,columns = xls_to_dict(filename)

为了保存,您也可以使用数据框删除 for 循环

xl = pd.ExcelFile(filename) 
sheet_name = xl.sheet_names[0] #sheet by index
df = pd.read_excel(xl, sheet_name)
df["DOB"] = pd.to_datetime(df["DOB"])
df["age"] = df["DOB"].apply(lambda x: abs(relativedelta(datetime.today(),x).years))
df["nationality"] = #logic to calculate nationality 

book = load_workbook(filename)
writer = pd.ExcelWriter(filename, engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
df.to_excel(writer, sheet_name)
writer.save()

推荐阅读