如何将给定的 Excel 文件转换为 Python 中的字典?
Posted
技术标签:
【中文标题】如何将给定的 Excel 文件转换为 Python 中的字典?【英文标题】:How to convert the given Excel file to a dictionary in Python? 【发布时间】:2021-07-01 20:30:14 【问题描述】:Excel数据格式:
文件,转换为 csv,内容如下:
'Details': 0: 'Mickey',
1: nan,
2: nan,
3: nan,
4: 'Doland',
5: nan,
6: nan,
7: nan,
'Unnamed: 1': 0: 'Mouse',
1: nan,
2: nan,
3: nan,
4: nan,
5: nan,
6: nan,
7: nan,
'Unnamed: 2': 0: 'Address1',
1: 'city',
2: 'street',
3: 'hno',
4: 'adress1',
5: 'city',
6: 'street',
7: 'hno',
'Unnamed: 3': 0: nan, 1: 'xxx', 2: 2, 3: 22, 4: nan, 5: 'zzz', 6: 3, 7: 33,
'Unnamed: 4': 0: 'address2',
1: 'city',
2: 'street',
3: 'hno',
4: 'address2',
5: 'city',
6: 'street',
7: 'hno',
'Unnamed: 5': 0: nan, 1: 'yyy', 2: 3, 3: 33, 4: nan, 5: 'www', 6: 4, 7: 44
如何将附加的 Excel 转换为 Python 中的字典?
预期的字典:
dict1 ='Details':[['Mickey','Mouse','Address1': 'city': 'xxx', 'Street': '2', 'hno': '22',
'Address2': 'city': 'yyy', 'Street': '3', 'hno': '33'],
['Doland','Duck','Address1': 'city': 'xxx', 'Street': '2', 'hno': '22',
'Address2': 'city': 'yyy', 'Street': '3', 'hno': '33']]
【问题讨论】:
能否将excel数据转换成csv并在问题部分发布记录? 您的数据有问题。 docs.google.com/spreadsheets/d/… 【参考方案1】:这是我能想到的最糟糕的解决方案:
df = pd.read_excel('samp.xlsx', header=[0],
index_col=[0,1])
d = 'details': []
for i, grp in df.groupby('Details'):
grp = (grp.T.ffill().T)
grp.columns = grp.iloc[0]
grp = grp[1:].T
name = ', '.join(grp.index.name)
val = grp.groupby(grp.index).apply(lambda x: dict(zip(x.iloc[0], x.iloc[1]))).to_dict()
final_val = ([name,val])
d['details'].append(final_val)
d:
'details': [['Donald, Duck',
'Address1': 'City': 'zzz', 'Street': 3, 'hno': 33,
'Address2': 'City': 'www', 'Street': 4, 'hno': 44],
['Mickey, Mouse',
'Address1': 'City': 'xxx', 'Street': 2, 'hno': 22,
'Address2': 'City': 'yyy', 'Street': 3, 'hno': 33]]
我已经在评论区发布了excel文件的链接。
基本上,我对每个按名称访问每个组(米老鼠和唐老鸭)使用 z 循环,然后我对其应用操作。
对不起,我着急稍后会添加解释。如果您在理解事情上有困难,请告诉我。
这个月牙:
grp.T.ffill().T
将帮助我用 Address1/Address2 填充 nan 值。这就是我转置它然后使用ffill
的原因。
之后,我想将每个组的起始行作为列。 一旦这一步完成。我的第一行将是关键,第二行将是我的价值。所以我将它们压缩在一起并创建了一本字典。希望这可以帮助您更好地理解逻辑。
【讨论】:
感谢您的出色解决方案!它有效,但我无法理解 for 循环中的前 3 行grp = (grp.T.ffill().T) grp.columns = grp.iloc[0] grp = grp[1:].T
你能更详细地了解这些步骤吗?并在您有时间时提供您的最佳解决方案版本。
@speed0001:还要检查图像。我已经添加了解释。请在每一步打印输出。【参考方案2】:
import xlrd
from xlrd import open_workbook
fp = tempfile.NamedTemporaryFile(delete= False, suffix=filetype)
fp.write(binascii.a2b_base64(selected file))
workbook = xlrd.open_workbook(file name)
sheet = workbook.sheet_by_name(sheet name)
row = [c or '' for c in sheet.row_values(header_row)]
first_row = []
for col in range(sheet.ncols):
first_row.append(sheet.cell_value(0,col) )
archive_lines = []
for row in range(1, sheet.nrows):
elm =
for col in range(sheet.ncols):
elm[first_row[col]]=sheet.cell_value(row,col)
archive_lines.append(elm)
【讨论】:
添加一些解释这段代码的作用。 此代码将整个 excel 文件作为字典读取 你能写一个工作代码吗?这似乎很有趣。我想玩这个代码。我以前从未在 xlrd 上工作过。 是的,我已经使用此代码将数据从 excel 文件导入 python 字典以上是关于如何将给定的 Excel 文件转换为 Python 中的字典?的主要内容,如果未能解决你的问题,请参考以下文章
unotools - 尝试使用 python 将 ods 或 excel 文件转换为 csv
如何在 Python 中将 Azure Blob 文件 CSV 转换为 Excel
如何将 Python 列表转换为 pandas DataFrame 或 excel 文件输出,具体要求如下:
Laravel:如何将 Excel 文件存储在给定的路径中?