python - 从 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
任何建议将被认真考虑。
解决方案
您可以通过将工作表数据转换为数据框并获取值作为列表来删除对行的迭代。
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()
推荐阅读
- dataframe - 如何在pyspark中转置只有一行和多列的数据框?
- javascript - 为什么将对象发布到 json 文件时,其中一个键/值总是显示为花括号?
- sql - SQL - 在 WHERE 子句中使用日期范围的结果集中未显示正确日期
- .net - 变量调用函数
- python - TypeHinting:如何输入 pygame Surface?
- delphi - Delphi,记录类型属性,记录字段赋值
- python - python - 如何根据python中的某些条件将当前行与txt文件中的上一行合并?
- api - REST API 的 DDD 细粒度存储库
- r - 如何在 R 库 (windRose) 中添加频率和百分比值?
- python - python:将字符串列表中的部分字符串与另一个列表中的项目进行比较并生成第三个列表