iT邦幫忙

0

python excel 問題4

  • 分享至 

  • xImage

各位大大好!我可以請教python讀兩個excel問題!

data.xlsx是學生成績單:
分別是學號、國文、英文、數學、理化成績的分數
照片如下:
https://ithelp.ithome.com.tw/upload/images/20231217/20145992V6YphfHJYk.png

data2.xlsx是學生成績單:
分別是學號、國文、英文、數學、理化成績的分數
照片如下:
https://ithelp.ithome.com.tw/upload/images/20231217/20145992HfxBdByFP2.png

import openpyxl
import pandas as pd
import numpy as np

# 讀取第一個 Excel 檔案
wb1 = openpyxl.load_workbook('data.xlsx')
sheet1 = wb1['sheet2']

# 讀取第二個 Excel 檔案
wb2 = openpyxl.load_workbook('data2.xlsx')
sheet2 = wb2['sheet2']

# 提取兩個工作表的最大行和最大列
max_row = max(sheet1.max_row, sheet2.max_row)
max_column = max(sheet1.max_column, sheet2.max_column)

print("max_row=", max_row, end='\n')
print("max_column=", max_column, end='\n')

# 將 Excel 資料轉換成 Pandas DataFrame
df1 = pd.DataFrame(sheet1.values)
df2 = pd.DataFrame(sheet2.values)

# 使用 NumPy 進行比較,並找出不同的值
mask = df1.ne(df2)
diff_locations = np.where(mask)

# 創建新的工作簿
wb3 = openpyxl.Workbook()
sheet3 = wb3.active



# 創建一個空的 DataFrame
result_df = pd.DataFrame(columns=["學號", "國文成績", "英文成績", "數學成績", "理化成績"])

s1=[]
s2=[]

start = 1
end = 5


while end <= max_row:
    
    for row, col in zip(*diff_locations):
        # 檢查索引位置是否有效(針對第一個檔案)
        if row < df1.shape[0] and col < df1.shape[1]:
            value1 = df1.iloc[row, col]
            s1.append(value1)
            
            print("s1=",s1)
            sheet3.append(s1)

        # 檢查索引位置是否有效(針對第二個檔案)
        if row < df2.shape[0] and col < df2.shape[1]:
            value2 = df2.iloc[row, col]
            s2.append(value2)
            print("s2=",s2)
            sheet3.append(s2)

        start += 5
        end += 5



result_df["學號"] = pd.Series(s1)
result_df["國文成績"] = pd.Series(s1)
result_df["英文成績"] = pd.Series(s1)
result_df["數學成績"] = pd.Series(s1)
result_df["理化成績"] = pd.Series(s1)


# 使用 loc[] 逐個元素填充 DataFrame
#result_df.loc[0] = pd.Series(s1)
#result_df.loc[len(result_df)] = pd.Series(s2)


# 如果需要印出 DataFrame,可以使用以下方式
print(result_df)



# 儲存新的 Excel 檔案
wb3.save('data3.xlsx')

# 存儲到 data3.xlsx
result_df.to_excel('data3.xlsx', index=False)

執行完後,data3.xlsx檔內容如下:
https://ithelp.ithome.com.tw/upload/images/20231217/201459921zaWh4sxwy.png

為甚麼data3.xlsx檔內容不是印出結果如下呢?
https://ithelp.ithome.com.tw/upload/images/20231217/20145992q0fJQcm2GP.png

我要怎麼修改上述程式碼呢?/images/emoticon/emoticon02.gif

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
rain_yu
iT邦新手 1 級 ‧ 2023-12-18 08:58:38

看你程式輸出基本上就可以判定是迴圈和欄位跑錯。
但是你沒有具體寫出你真正想輸出的結果,不太好處理。
圖片以外最好還要詳細描述,例如:
想要用python讀取excel,
A欄開始分別是學號、B:國文、C:英文、D:數學、E:理化。
已知excel1 有25筆,excel2欄有26筆,excel1&2前25筆是相同的,
所以需要單獨列出第26筆。
輸出應為A、B、C、D、E
A:26 B:{國文成績}、C:{英文成績}、D:{數學成績}、E:{理化成績}。
但是實際輸出變成
A、B、C、D、E
26、26、26、26、26
{國文成績}、{國文成績}、{國文成績}、{國文成績}、{國文成績}
.
.
.
該如何解決上述錯誤;

一些邏輯錯誤和重複使用相同的資料的問題;但不確定是不是你要的邏輯,
以下是我對程式碼的修改建議:
刪除了使用 pandas 和 numpy 的部分,因為你只需要使用 openpyxl 來處理 Excel 檔案。
使用兩個迴圈來複製前 25 筆資料到新的工作表。
使用另一個迴圈來複製第 26 筆資料到新的工作表。
儲存新的 Excel 檔案。
這些修改將使程式碼能夠正確地處理你所描述的需求,將前 25 筆資料從第一個 Excel 檔案複製到新的工作表,並將第 26 筆資料從第二個 Excel 檔案複製到新的工作表。

import openpyxl
import pandas as pd

# 讀取第一個 Excel 檔案
wb1 = openpyxl.load_workbook('data.xlsx')
sheet1 = wb1['sheet2']

# 讀取第二個 Excel 檔案
wb2 = openpyxl.load_workbook('data2.xlsx')
sheet2 = wb2['sheet2']

# 提取兩個工作表的最大行和最大列
max_row = max(sheet1.max_row, sheet2.max_row)
max_column = max(sheet1.max_column, sheet2.max_column)

print("max_row=", max_row, end='\n')
print("max_column=", max_column, end='\n')

# 創建新的工作簿
wb3 = openpyxl.Workbook()
sheet3 = wb3.active

# 複製前25筆資料
for row in range(1, 26):
    for col in range(1, max_column + 1):
        value = sheet1.cell(row=row, column=col).value
        sheet3.cell(row=row, column=col, value=value)

# 複製第26筆資料
for col in range(2, max_column + 1):
    value = sheet2.cell(row=26, column=col).value
    sheet3.cell(row=26, column=col, value=value)

# 儲存新的 Excel 檔案
wb3.save('data3.xlsx')

上面是已知的狀況下單獨輸出第26筆,你先測一下是否是對的。

下面是嘗試找到不同的就要輸出,一樣需要你自行驗證後修改。

import openpyxl

# 讀取第一個 Excel 檔案
wb1 = openpyxl.load_workbook('data.xlsx')
sheet1 = wb1['sheet2']

# 讀取第二個 Excel 檔案
wb2 = openpyxl.load_workbook('data2.xlsx')
sheet2 = wb2['sheet2']

# 提取兩個工作表的最大行和最大列
max_row = max(sheet1.max_row, sheet2.max_row)
max_column = max(sheet1.max_column, sheet2.max_column)

print("max_row=", max_row)
print("max_column=", max_column)

# 創建新的工作簿
wb3 = openpyxl.Workbook()
sheet3 = wb3.active

# 比較兩個工作表的資料
different_rows = []
for row in range(1, max_row + 1):
    different = False
    for col in range(1, max_column + 1):
        value1 = sheet1.cell(row=row, column=col).value
        value2 = sheet2.cell(row=row, column=col).value
        sheet3.cell(row=row, column=col, value=value1)
        if value1 != value2:
            different = True

    if different:
        different_rows.append(row)

# 在新的工作表中輸出不同的資料
wb4 = openpyxl.Workbook()
sheet4 = wb4.active
for row in different_rows:
    for col in range(1, max_column + 1):
        value = sheet2.cell(row=row, column=col).value
        sheet4.cell(row=row, column=col, value=value)

# 儲存新的 Excel 檔案
wb3.save('data3.xlsx')
wb4.save('different_data.xlsx')

謝謝大大的建議,真是抱歉,我表達能力太差,請見諒

1
一級屠豬士
iT邦大師 1 級 ‧ 2023-12-18 09:04:45

看你同樣的事情,發了4篇.給你一些建議.

測試資料不要變來變去.

截圖方式要考慮到有效資訊的範圍,例如你這篇,一大堆空白,一堆數字很小,是不是調整一下較好.
你之前也有一篇,好像是2吧,只有一個數字不同,但是你的cursor 沒放到那裡,變成要幫你找.

你最好把測試資料統一,整理好,這裡可以上傳檔案的,用壓縮的,放不下時也可以找其他地方,
例如一些雲端服務.不然要別人還要自己打開excel,看著一堆小小的字,慢慢打.

Python的主力工作馬是List, List 跟 List 是可以比較的.

Python讀Excel, Cell 可以轉 List, 然後善用 List.

做這個的目的是什麼? 要先能夠說清楚,不是用Python處理Excel,而是資訊技術有非常多,
目的與手段要能分清楚,這個我時常提到,當然有些人還因為這個會有些神奇的反應,例如說我發言不友善,還要檢舉.希望你不是這樣的人.

另外,我建議你別把Excel 當作處理資料的主力,你看你實際使用時,多麼的不方便,之前也有一個
也是一直用Excel 搭 Python, 大概是市面上有些書或是課程,使用了Excel當例子.
那個也只是例子而已. 然後就沒有什麼人會回答,所以就 喔,又有菜鳥堅持用Excel喔,
那算了....

看更多先前的回應...收起先前的回應...

真是抱歉,我下次會統整好,再問

謝謝您的寶貴建議

遇到問題時,又百思不得其解,是正常的.
起碼你有毅力想要解決,過程當然是逐漸越來越好.
加油!

謝謝妳

我要發表回答

立即登入回答