處理json格式的資料

Trouvaille_fighting發表於2024-07-23

如何處理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

相關文章