如何處理json格式的資料
1. 主要處理三類資料
- 帶有json格式的資料
- 形式:[{key:value}]
- 提取:文字、圖片連結、文件連結
[{"content":"點選“產品開發庫”,右上角“展開篩選”,按條件篩選流程資訊。","type":"text"},{"content":"\n","type":"text"},{"height":0,"key":"img_v3_02cu_1899636b-dfc3-43df-97fe-80ccc774c32g","src":"圖片連結","type":"img","width":1313},{"content":"\n","type":"text"},{"content":"\n","type":"text"}]
- 純字串
- 第一種需要提取出來“”之間的內容
- 第二種需要提取單行的內容
資料一:
"1、檢視當前審批人:可在正式資料發放/過程資料發放中,當前審批人員列中檢視當前審批人。如已審批完則不顯示審批人。
2、單據狀態:在狀態列,第1個小圖示表示單據的流程狀態(滑鼠懸停可顯示),第2個小圖示表示資料狀態(滑鼠懸停可顯示)"
資料二:
計劃完成時間前提交任務就不算超期
程式碼:
import re
import json
import pandas as pd
# 示例輸入檔案路徑
input_file_path = 'C:\\Users\\user\\Desktop\\test.txt'
# 處理多行“”中的內容,並把他們合併為一個內容+單行純文字
def parse_notebook_file(input_file):
datalist = []
with open(input_file, 'r', encoding='utf-8') as f:
for line in f:
try:
# 嘗試將行解析為JSON
datalist.append(json.loads(line))
except json.JSONDecodeError:
final_text = ""
if line.startswith('"'):
final_text+=line[1:] #去除第一行的單引號
# print(line[1:])
# 如果當前行以雙引號開始,嘗試找到以雙引號結束的行
for next_line in f:
if len(re.findall(r'"', next_line))%2!=1 : #判斷“個數是否奇數
final_text += next_line
# print(final_text)
else:
final_text += next_line[:len(next_line)-2] #去除最後一行的單引號
# print(final_text)
datalist.append(final_text)
# print(datalist)
break
# break
# 如果找到以雙引號結束的行,將這兩行之間的內容作為一個文字條目新增到列表中
else:
# 如果解析失敗,則將行作為純文字新增
datalist.append(line.strip())
# for data in datalist:
# print(data)
# print('---------')
return datalist
# 處理輸入檔案並生成datalist
datalist = parse_notebook_file(input_file_path)
# 提取json字串中的中文、圖片連結、文件連結
def collect_pure_text_and_links(datalist):
results = []
for data in datalist:
# print(data)
# print('----------------------')
if isinstance(data, list): # 檢查是否為列表(JSON格式-列表中巢狀字典)
# print(data)
content_parts = []
for item in data:
# print(item)
if item["type"] == "text":
# 提取中文
chinese_text = re.findall(r'[\u4e00-\u9fa5]+', item["content"])
# 提取連結
links = re.findall(r'https?://[^\s]+', item["content"])
# 合併中文和連結
combined_content = ' '.join(chinese_text + links)
if combined_content:
# print(item["content"].replace(combined_content, combined_content.replace(',', ',')))
content_parts.append(item["content"].replace(combined_content, combined_content.replace(',', ',')))
elif item["type"] == "img":
# 新增圖片連結
# print(item["src"])
content_parts.append(item["src"])
elif item["type"] == "hyperlink":
# 提取連結和文字
content_parts.append(item["text"])
# print(item["text"])
content_parts.append(item["url"])
# print(item["url"])
results.append(' '.join(content_parts))
# print('----------------------')
else:
results.append(data)
# print('----------------------')
for data_r in results:
print(data_r)
print('----------------------')
return results
# 使用新函式處理並收集資料
collected_data = collect_pure_text_and_links(datalist)
# 將收集的資料儲存到Excel檔案中
output_file_path = 'C:\\Users\\user\\Desktop\\test_output.xlsx' #輸出路徑,執行程式時,該檔案不要開啟
df = pd.DataFrame(collected_data, columns=['Content'])
df.to_excel(output_file_path, index=False)
output_file_path