我有一個程式如下:
- 有多個檔案夾包含名為“installed-files.json”的 JSON 檔案。
- 假設程式從每個子檔案夾中讀取 JSON 檔案。
- 如果 JSON 檔案在那里,則將其轉換為 xlsx 格式。
- xlsx 格式應具有根據子檔案夾名稱命名的作業表。例如,如果子檔案夾的名稱是 CNA,則作業表名稱應該是 CNA 等。
下面是代碼片段
import pandas as pd
import json
import os
def traverse_dir(rootDir, file_name):
dir_names = []
for names in os.listdir(rootDir):
entry_path = os.path.join(rootDir, names)
if os.path.isdir(entry_path):
dir_names.append(entry_path)
for fil_name in dir_names:
file_path = os.path.join(fil_name, file_name)
print(file_path)
if os.path.isfile(file_path):
with open(file_path) as jf:
data = json.load(jf)
df = pd.DataFrame(data)
df1 = pd.DataFrame(data)
new_df = df[df.columns.difference(['SHA256'])]
new_df1 = df1[df.columns.difference(['SHA256'])]
with pd.ExcelWriter('abc.xlsx') as writer:
new_df.to_excel(writer, sheet_name='BRA', index=False)
new_df1.to_excel(writer, sheet_name='CNA', index=False)
else:
print("file not found")
rootDir = <Full_Path_To_Sub-dirs>
file_name = 'installed-files.json'
traverse_dir(rootDir, file_name)
下面是示例 JSON 檔案內容
[
{
"SHA256": "123456",
"Name": "/system/Home.apk",
"Size": 99250072
},
{
"SHA256": "987654",
"Name": "/system/Setup.apk",
"Size": 86578788
},
{
"SHA256": "457457",
"Name": "/system/SApp.apk",
"Size": 72207922
},
{
"SHA256": "747645",
"Name": "/system/Lib.apk",
"Size": 57960376
},
{
"SHA256": "368764",
"Name": "/system/mium.so",
"Size": 51161376
},
{
"SHA256": "34455",
"Name": "/system/Smart.apk",
"Size": 50944780
},
{
"SHA256": "66777",
"Name": "/system/framework/work.jar",
"Size": 24772514
},
]
問題陳述:
雖然根據子檔案夾名稱(BRA 和 CNA)創建了 excel 表。但資料僅來自CNA。我可以確認這一點,因為兩個子目錄中的 JSON 檔案最初具有相同的資料。因此,為了測驗我的用例,我首先修改了 BRA 的內容。但是在執行代碼之后,這些更改不會出現在創建的兩個選項卡中的任何一個的新 excel 檔案中。因此,我修改了 CNA 子檔案夾中的 JSON 檔案。現在,當我執行程式時,我可以在 excel 檔案的兩個選項卡中看到那些修改過的資料。
任何想法,為什么會發生這種情況?
我還附上了 - 專案目錄結構截圖。
uj5u.com熱心網友回復:
你的問題是你每次找到一個檔案時都在寫一個excel,你讀到兩個資料幀的資料是一樣的,因為你是從同一個JSON檔案中獲取的。此外,您必須檢查,new_df1 = df1[df.columns.difference(['SHA256'])]因為您使用的是 df 和 df1,我不確定這是否是您想要的。
無論哪種方式,這是一個有效的代碼片段:
import pandas as pd
import json
import os
def traverse_dir(root: str, file_name: str):
data_cna = None
data_bra = None
for dir in os.listdir(root):
dir_path = os.path.join(root, dir)
# Grabs only the directories
if not os.path.isdir(dir_path):
continue
for file in os.listdir(dir_path):
file_path = os.path.join(dir_path, file)
# Grabs only the files within the directories and with the name passed
if not os.path.isfile(file_path):
continue
if file != file_name:
continue
if dir == "CNA":
with open(file_path) as freader:
data_cna = json.load(freader)
elif dir == "BRA":
with open(file_path) as freader:
data_bra = json.load(freader)
else:
# Other directories names are ignored
continue
if data_cna is None:
raise ValueError(f"{file_name} not found in {os.path.join(root, 'CNA')}")
if data_bra is None:
raise ValueError(f"{file_name} not found in {os.path.join(root, 'BRA')}")
df_cna = pd.DataFrame(data_cna)[pd.DataFrame(data_cna).columns.difference(['SHA256'])]
# Shouldn't this be: df_bra = pd.DataFrame(data_bra)[pd.DataFrame(data_bra).columns.difference(['SHA256'])],
# I mean replace data_cna difference by data_bra. Check your code.
df_bra = pd.DataFrame(data_bra)[pd.DataFrame(data_cna).columns.difference(['SHA256'])]
with pd.ExcelWriter('abc.xlsx') as writer:
df_cna.to_excel(writer, sheet_name='CNA', index=False)
df_bra.to_excel(writer, sheet_name='BRA', index=False)
rootDir = "."
file_name = 'installed-files.json'
traverse_dir(rootDir, file_name)
CNA JSON:
[
{
"SHA256": "123456",
"Name": "/system/Home.apk",
"Size": 99250072
},
{
"SHA256": "987654",
"Name": "/system/Setup.apk",
"Size": 86578788
}
]
胸罩 JSON:
[
{
"SHA256": "66777",
"Name": "/system/framework/work.jar",
"Size": 24772514
}
]
xls 輸出 CNA 頁面:

xls 輸出 BRA 頁面:

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/408937.html
標籤:
