最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于FastAPI與LangChain開發(fā)Excel智能數(shù)據(jù)分析API詳解

 更新時(shí)間:2025年10月14日 08:45:57   作者:東方佑  
本文將詳細(xì)介紹如何使用FastAPI和LangChain構(gòu)建一個(gè)支持流式響應(yīng)的Excel智能數(shù)據(jù)分析API,實(shí)現(xiàn)對結(jié)構(gòu)化數(shù)據(jù)的自然語言查詢與對話式分析,需要的可以了解下

一、項(xiàng)目概述與核心功能

在現(xiàn)代數(shù)據(jù)驅(qū)動(dòng)決策的環(huán)境中,讓非技術(shù)用戶能夠通過自然語言與數(shù)據(jù)進(jìn)行交互變得越來越重要。本項(xiàng)目開發(fā)了一個(gè)基于RESTful API的智能數(shù)據(jù)分析服務(wù),具有以下核心功能:

  • 自然語言查詢: 用戶可以使用日常語言提問關(guān)于Excel數(shù)據(jù)的問題
  • 多會(huì)話管理: 支持多用戶同時(shí)使用,各自維護(hù)獨(dú)立的對話歷史
  • 流式響應(yīng): 提供真正的流式輸出體驗(yàn),大幅提升用戶體驗(yàn)
  • Excel數(shù)據(jù)支持: 支持讀取和解析多工作表的Excel文件
  • 智能代理: 基于LangChain構(gòu)建的Pandas數(shù)據(jù)分析代理

二、技術(shù)架構(gòu)與工具選擇

本項(xiàng)目采用了以下技術(shù)棧,每項(xiàng)技術(shù)都承擔(dān)著特定角色:

技術(shù)組件版本要求職責(zé)說明
FastAPI>=0.68.0高性能Web框架,提供API服務(wù)
LangChain>=0.12.0智能代理和鏈?zhǔn)教幚砗诵?/td>
Pandas>=1.3.0DataFrame數(shù)據(jù)處理和分析
Uvicorn>=0.15.0ASGI服務(wù)器,用于運(yùn)行FastAPI
Tongyi Qwen-大語言模型,提供自然語言理解能力

技術(shù)選型理由

  • FastAPI:憑借其異步支持、自動(dòng)文檔生成和高性能特性,成為Python API開發(fā)的首選
  • LangChain:提供了與大語言模型集成的標(biāo)準(zhǔn)化方式,簡化了代理創(chuàng)建和管理
  • Pandas:是Python數(shù)據(jù)分析的事實(shí)標(biāo)準(zhǔn)庫,完美處理Excel文件
  • 流式響應(yīng):通過Server-Sent Events(SSE)實(shí)現(xiàn)真正流式輸出,提升用戶體驗(yàn)

三、核心實(shí)現(xiàn)細(xì)節(jié)

3.1 FastAPI應(yīng)用初始化

首先創(chuàng)建FastAPI應(yīng)用實(shí)例,并設(shè)置元數(shù)據(jù)信息:

from fastapi import FastAPI

app = FastAPI(
    title="Excel Data Analysis API",
    description="基于Pandas DataFrame的數(shù)據(jù)分析API",
    version="1.0.0"
)

FastAPI基于Python類型提示自動(dòng)生成API文檔,支持OpenAPI標(biāo)準(zhǔn),開發(fā)者可以通過/docs/redoc端點(diǎn)訪問交互式文檔。

3.2 數(shù)據(jù)加載與代理初始化

項(xiàng)目啟動(dòng)時(shí)自動(dòng)加載Excel數(shù)據(jù)并初始化LangChain代理:

@app.on_event("startup")
async def startup_event():
    """應(yīng)用啟動(dòng)時(shí)初始化模型和代理"""
    try:
        initialize_agent()
        print("模型和代理初始化成功")
    except Exception as e:
        print(f"初始化失敗: {e}")
        raise

數(shù)據(jù)加載過程支持多工作表Excel文件,自動(dòng)合并所有工作表到一個(gè)DataFrame中:

def initialize_agent():
    global llm, pandas_agent
    
    # 讀取Excel文件中的所有工作表
    excel_file = pd.ExcelFile(path)
    all_sheets = {}
    for sheet_name in excel_file.sheet_names:
        all_sheets[sheet_name] = pd.read_excel(excel_file, sheet_name=sheet_name)
    
    # 合并所有工作表
    df = pd.concat(all_sheets.values(), ignore_index=True)

這種方法確保了無論Excel文件的結(jié)構(gòu)如何,都能完整地加載所有數(shù)據(jù)。

3.3 LangChain代理創(chuàng)建

使用LangChain的create_pandas_dataframe_agent創(chuàng)建專門用于Pandas數(shù)據(jù)處理的AI代理:

pandas_agent = create_pandas_dataframe_agent(
    llm,  # 通義千問模型實(shí)例
    df,   # 合并后的DataFrame
    verbose=True,  # 啟用詳細(xì)日志
    agent_type="zero-shot-react-description",  # 代理類型
    allow_dangerous_code=True,  # 允許執(zhí)行代碼
    max_iterations=5  # 最大迭代次數(shù)
)

這種代理結(jié)合了大語言模型的語言理解能力和Pandas的數(shù)據(jù)處理能力,能夠理解自然語言查詢并將其轉(zhuǎn)換為DataFrame操作。

3.4 流式響應(yīng)實(shí)現(xiàn)

為實(shí)現(xiàn)真正的流式輸出,創(chuàng)建了自定義回調(diào)處理器:

class StreamingCallbackHandler(BaseCallbackHandler):
    """自定義回調(diào)處理器,用于實(shí)現(xiàn)真正的流式輸出"""

    def __init__(self):
        self.tokens = []
        self.finished = False

    def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
        """當(dāng)LLM生成新token時(shí)調(diào)用"""
        self.tokens.append(token)

    def on_llm_end(self, response: Any, **kwargs: Any) -> None:
        """當(dāng)LLM生成結(jié)束時(shí)調(diào)用"""
        self.finished = True

流式響應(yīng)接口使用Server-Sent Events(SSE)技術(shù):

@app.post("/chat", response_model=ChatResponse)
async def chat_with_data(request: ChatRequest):
    # ... 省略其他代碼 ...
    
    if request.stream:
        return StreamingResponse(
            true_stream_response(full_input, session_history, request.session_id),
            media_type="text/event-stream",
            headers={
                "Cache-Control": "no-cache",
                "Connection": "keep-alive",
            }
        )

這種方式相比傳統(tǒng)響應(yīng),能夠?qū)崟r(shí)地將生成的token發(fā)送給客戶端,大幅減少用戶感知的延遲。

3.5 會(huì)話管理機(jī)制

為實(shí)現(xiàn)多用戶支持,實(shí)現(xiàn)了基于session_id的會(huì)話管理:

conversation_history = {}

# 在聊天接口中維護(hù)會(huì)話歷史
session_history = conversation_history.get(request.session_id, [])
session_history.append(request.message)
conversation_history[request.session_id] = session_history

還提供了清除歷史記錄的端點(diǎn):

@app.delete("/clear_history/{session_id}")
async def clear_history(session_id: str):
    """清除指定會(huì)話的歷史記錄"""
    if session_id in conversation_history:
        del conversation_history[session_id]
    return {"message": f"會(huì)話 {session_id} 的歷史記錄已清除"}

這種設(shè)計(jì)允許不同用戶或不同對話線程保持獨(dú)立的上下文歷史。

四、API端點(diǎn)設(shè)計(jì)

本項(xiàng)目實(shí)現(xiàn)了以下RESTful端點(diǎn):

端點(diǎn)方法描述參數(shù)
/chatPOST主聊天接口,支持流式和非流式響應(yīng)session_id, message, history_length, stream
/clear_history/{session_id}DELETE清除指定會(huì)話的歷史記錄session_id
/healthGET健康檢查端點(diǎn)
/stream_testGET流式接口測試端點(diǎn)

主要請求和響應(yīng)模型

class ChatRequest(BaseModel):
    session_id: str  # 會(huì)話ID,用于區(qū)分不同用戶的對話歷史
    message: str  # 用戶消息
    history_length: Optional[int] = 5  # 歷史消息長度,默認(rèn)為5
    stream: Optional[bool] = False  # 是否使用流式響應(yīng)

class ChatResponse(BaseModel):
    session_id: str
    response: str
    success: bool
    error: Optional[str] = None

五、部署與性能優(yōu)化

5.1 生產(chǎn)環(huán)境部署

使用Uvicorn作為ASGI服務(wù)器部署應(yīng)用:

uvicorn main:app --host 0.0.0.0 --port 9113 --workers 4 --timeout-keep-alive 300

參數(shù)說明

  • --workers 4:啟動(dòng)4個(gè)工作進(jìn)程,充分利用多核CPU
  • --timeout-keep-alive 300:保持連接超時(shí)時(shí)間設(shè)置為300秒
  • --host 0.0.0.0:監(jiān)聽所有網(wǎng)絡(luò)接口

5.2 性能優(yōu)化建議

  • 緩存機(jī)制:引入Redis緩存頻繁查詢的結(jié)果
  • 數(shù)據(jù)庫持久化:使用Redis或數(shù)據(jù)庫持久化會(huì)話歷史,替代內(nèi)存存儲(chǔ)
  • 負(fù)載均衡:在多服務(wù)器部署時(shí)使用Nginx進(jìn)行負(fù)載均衡
  • 異步處理:確保所有I/O操作都使用異步方式,避免阻塞事件循環(huán)

六、應(yīng)用場景與擴(kuò)展方向

6.1 典型應(yīng)用場景

  • 企業(yè)數(shù)據(jù)分析:讓業(yè)務(wù)人員通過自然語言查詢銷售數(shù)據(jù)、業(yè)績指標(biāo)等
  • 學(xué)術(shù)研究:研究人員快速探索實(shí)驗(yàn)數(shù)據(jù),發(fā)現(xiàn)潛在模式
  • 財(cái)務(wù)報(bào)表分析:自動(dòng)解析財(cái)務(wù)數(shù)據(jù),回答關(guān)于收入、支出和利潤的問題
  • 客戶支持:分析客戶反饋數(shù)據(jù),識(shí)別常見問題和趨勢

6.2 擴(kuò)展方向

  • 多數(shù)據(jù)源支持:擴(kuò)展支持?jǐn)?shù)據(jù)庫、CSV、JSON等更多數(shù)據(jù)格式
  • 可視化集成:將分析結(jié)果以圖表形式返回,增強(qiáng)數(shù)據(jù)表現(xiàn)力
  • 權(quán)限控制:增加用戶認(rèn)證和授權(quán),控制數(shù)據(jù)訪問權(quán)限
  • 預(yù)定義查詢模板:提供常用查詢模板,降低用戶學(xué)習(xí)成本
  • 批量處理:支持批量查詢和異步處理大量分析任務(wù)

七、總結(jié)與展望

本項(xiàng)目展示了如何將FastAPI、LangChain和大語言模型結(jié)合,構(gòu)建一個(gè)功能強(qiáng)大的智能數(shù)據(jù)分析API。關(guān)鍵優(yōu)勢包括:

  • 自然語言交互:降低了數(shù)據(jù)查詢的技術(shù)門檻
  • 流式響應(yīng):大幅提升了用戶體驗(yàn),減少等待時(shí)間
  • 多會(huì)話支持:適合多用戶并發(fā)使用場景
  • 易于擴(kuò)展:模塊化設(shè)計(jì)方便后續(xù)功能擴(kuò)展

未來發(fā)展方向

  • 支持更多數(shù)據(jù)源和格式
  • 增加數(shù)據(jù)可視化能力
  • 實(shí)現(xiàn)更復(fù)雜的對話狀態(tài)管理
  • 提供查詢建議和自動(dòng)補(bǔ)全功能

通過這種技術(shù)組合,我們能夠?qū)⑾冗M(jìn)的大語言模型能力轉(zhuǎn)化為實(shí)用的企業(yè)級(jí)應(yīng)用,真正實(shí)現(xiàn)"用自然語言與數(shù)據(jù)對話"的愿景。

完整代碼

# main.py
import pandas as pd
from langchain_community.chat_models.tongyi import ChatTongyi
from langchain_experimental.agents import create_pandas_dataframe_agent
import os
from fastapi import FastAPI, HTTPException, Request
from pydantic import BaseModel
from typing import List, Optional
from fastapi.responses import StreamingResponse
import asyncio
import json
import time
from langchain.callbacks.base import BaseCallbackHandler
from typing import Any, Dict, List
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate

# 初始化 FastAPI 應(yīng)用
app = FastAPI(title="Excel Data Analysis API", description="基于 Pandas DataFrame 的數(shù)據(jù)分析 API")

# 全局變量存儲(chǔ)模型和代理
llm = None
pandas_agent = None
conversation_history = {}


class StreamingCallbackHandler(BaseCallbackHandler):
    """自定義回調(diào)處理器,用于實(shí)現(xiàn)真正的流式輸出"""

    def __init__(self):
        self.tokens = []
        self.finished = False

    def on_llm_new_token(self, token: str, **kwargs: Any) -> None:
        """當(dāng)LLM生成新token時(shí)調(diào)用"""
        self.tokens.append(token)

    def on_llm_end(self, response: Any, **kwargs: Any) -> None:
        """當(dāng)LLM生成結(jié)束時(shí)調(diào)用"""
        self.finished = True

    def get_tokens(self):
        """獲取已生成的tokens"""
        return self.tokens


class ChatRequest(BaseModel):
    session_id: str  # 會(huì)話ID,用于區(qū)分不同用戶的對話歷史
    message: str  # 用戶消息
    history_length: Optional[int] = 5  # 歷史消息長度,默認(rèn)為5
    stream: Optional[bool] = False  # 是否使用流式響應(yīng)


class ChatResponse(BaseModel):
    session_id: str
    response: str
    success: bool
    error: Optional[str] = None


def initialize_agent():
    """初始化模型和數(shù)據(jù)代理"""
    global llm, pandas_agent

    path = r'./data/1.xlsx'

    # 檢查文件是否存在
    if not os.path.exists(path):
        raise FileNotFoundError(f"文件未找到:{path}")

    # 讀取 Excel 中的所有工作表
    excel_file = pd.ExcelFile(path)
    all_sheets = {}
    for sheet_name in excel_file.sheet_names:
        all_sheets[sheet_name] = pd.read_excel(excel_file, sheet_name=sheet_name)

    # 合并所有工作表到一個(gè)DataFrame中
    df = pd.concat(all_sheets.values(), ignore_index=True)

    os.environ["DASHSCOPE_API_KEY"] = 'sk-50254f6d4df1ab3c9baf30093c4e'

    llm = ChatTongyi(
        model="qwen-max-latest",
        temperature=0.4,
        streaming=True  # 啟用流式輸出
    )

    # 創(chuàng)建excel_agent
    pandas_agent = create_pandas_dataframe_agent(
        llm,
        df,
        verbose=True,
        agent_type="zero-shot-react-description",
        allow_dangerous_code=True,
        max_iterations=5
    )


@app.on_event("startup")
async def startup_event():
    """應(yīng)用啟動(dòng)時(shí)初始化模型和代理"""
    try:
        initialize_agent()
        print("模型和代理初始化成功")
    except Exception as e:
        print(f"初始化失敗: {e}")
        raise


@app.post("/chat", response_model=ChatResponse)
async def chat_with_data(request: ChatRequest):
    """與數(shù)據(jù)進(jìn)行對話(支持流式和非流式響應(yīng))"""
    global pandas_agent, conversation_history

    if not pandas_agent:
        raise HTTPException(status_code=500, detail="模型未初始化")

    try:
        # 獲取或創(chuàng)建會(huì)話歷史
        session_history = conversation_history.get(request.session_id, [])

        # 構(gòu)建歷史文本
        history_text = "\n".join(session_history[-request.history_length:])

        # 構(gòu)造帶上下文的輸入
        if history_text:
            full_input = f"聊天歷史:{history_text},當(dāng)前問題:{request.message},請根據(jù)歷史和當(dāng)前問題,不要截?cái)噍敵?,展示全部?nèi)容,不要總結(jié),嚴(yán)格按照查詢內(nèi)容輸出,不要多余輸出,如果無法確定指代對象,請?jiān)儐栍脩舫吻?,并且不要編造?.strip()
        else:
            full_input = request.message

        # 如果請求流式響應(yīng)
        if request.stream:
            return StreamingResponse(
                true_stream_response(full_input, session_history, request.session_id),
                media_type="text/event-stream",
                headers={
                    "Cache-Control": "no-cache",
                    "Connection": "keep-alive",
                }
            )

        # 非流式響應(yīng)
        response = pandas_agent.invoke({"input": full_input})
        output = response['output'] if isinstance(response, dict) else str(response)

        # 更新會(huì)話歷史
        session_history.append(request.message)
        conversation_history[request.session_id] = session_history

        return ChatResponse(
            session_id=request.session_id,
            response=output,
            success=True
        )

    except Exception as e:
        if request.stream:
            # 對于流式請求,返回流式錯(cuò)誤響應(yīng)
            async def error_stream():
                yield f"data: {json.dumps({'error': str(e)})}\n\n"

            return StreamingResponse(error_stream(), media_type="text/event-stream")
        else:
            return ChatResponse(
                session_id=request.session_id,
                response="",
                success=False,
                error=str(e)
            )


async def true_stream_response(input_text: str, session_history: list, session_id: str):
    """真正的流式響應(yīng)生成器"""
    global pandas_agent, conversation_history

    try:
        # 使用回調(diào)處理器捕獲流式輸出
        callback_handler = StreamingCallbackHandler()

        # 在后臺(tái)運(yùn)行代理處理
        async def run_agent():
            try:
                # 調(diào)用代理,傳入回調(diào)處理器
                response = await asyncio.get_event_loop().run_in_executor(
                    None,
                    lambda: pandas_agent.invoke(
                        {"input": input_text},
                        {"callbacks": [callback_handler]}
                    )
                )

                # 確保結(jié)束標(biāo)記被設(shè)置
                callback_handler.finished = True

            except Exception as e:
                print(f"代理執(zhí)行錯(cuò)誤: {e}")
                callback_handler.finished = True

        # 啟動(dòng)代理任務(wù)
        agent_task = asyncio.create_task(run_agent())

        # 流式輸出循環(huán)
        last_token_count = 0
        start_time = time.time()
        max_wait_time = 60  # 最大等待時(shí)間60秒

        while not callback_handler.finished and (time.time() - start_time) < max_wait_time:
            current_tokens = callback_handler.get_tokens()

            # 如果有新token,發(fā)送給客戶端
            if len(current_tokens) > last_token_count:
                for i in range(last_token_count, len(current_tokens)):
                    token_data = {
                        "token": current_tokens[i],
                        "type": "token"
                    }
                    yield f"data: {json.dumps(token_data)}\n\n"

                last_token_count = len(current_tokens)

            # 短暫等待后繼續(xù)檢查
            await asyncio.sleep(0.1)

        # 如果超時(shí),發(fā)送錯(cuò)誤信息
        if (time.time() - start_time) >= max_wait_time:
            error_data = {"error": "請求超時(shí)", "type": "error"}
            yield f"data: {json.dumps(error_data)}\n\n"
        else:
            # 發(fā)送完成標(biāo)記
            done_data = {"done": True, "type": "done"}
            yield f"data: {json.dumps(done_data)}\n\n"

            # 更新會(huì)話歷史
            current_message = input_text.split("當(dāng)前問題:")[1].split(",")[
                0] if "當(dāng)前問題:" in input_text else input_text
            session_history.append(current_message)
            conversation_history[session_id] = session_history

        # 等待代理任務(wù)完成(如果還未完成)
        if not agent_task.done():
            agent_task.cancel()

    except Exception as e:
        error_data = {"error": f"流式處理錯(cuò)誤: {str(e)}", "type": "error"}
        yield f"data: {json.dumps(error_data)}\n\n"


@app.delete("/clear_history/{session_id}")
async def clear_history(session_id: str):
    """清除指定會(huì)話的歷史記錄"""
    if session_id in conversation_history:
        del conversation_history[session_id]
    return {"message": f"會(huì)話 {session_id} 的歷史記錄已清除"}


@app.get("/health")
async def health_check():
    """健康檢查接口"""
    return {
        "status": "healthy",
        "model_loaded": pandas_agent is not None,
        "active_sessions": len(conversation_history)
    }


@app.get("/stream_test")
async def stream_test():
    """測試流式接口"""

    async def generate_test_data():
        for i in range(10):
            yield f"data: 測試消息 {i}\n\n"
            await asyncio.sleep(1)

    return StreamingResponse(generate_test_data(), media_type="text/event-stream")


if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="0.0.0.0", port=9113)  

以上就是基于FastAPI與LangChain開發(fā)Excel智能數(shù)據(jù)分析API詳解的詳細(xì)內(nèi)容,更多關(guān)于FastAPI開發(fā)Excel數(shù)據(jù)分析API的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Python利用3D引擎做一個(gè)太陽系行星模擬器

    Python利用3D引擎做一個(gè)太陽系行星模擬器

    Python有一個(gè)不錯(cuò)的3D引擎——Ursina。本文就來利用Ursina這一3D引擎做一個(gè)太陽系行星模擬器,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-01-01
  • 利用Python自動(dòng)生成PPT的示例詳解

    利用Python自動(dòng)生成PPT的示例詳解

    在日常工作中,PPT制作是常見的工作。這篇文章主要為大家詳細(xì)介紹了如何利用Python自動(dòng)生成PPT,文中的示例代碼講解詳細(xì),感興趣的可以了解一下
    2022-07-07
  • Python數(shù)據(jù)持久化shelve模塊用法分析

    Python數(shù)據(jù)持久化shelve模塊用法分析

    這篇文章主要介紹了Python數(shù)據(jù)持久化shelve模塊用法,結(jié)合實(shí)例形式較為詳細(xì)的總結(jié)分析了shelve模塊的功能、原理及簡單使用方法,需要的朋友可以參考下
    2018-06-06
  • Python將8位的圖片轉(zhuǎn)為24位的圖片實(shí)現(xiàn)方法

    Python將8位的圖片轉(zhuǎn)為24位的圖片實(shí)現(xiàn)方法

    這篇文章主要介紹了Python將8位的圖片轉(zhuǎn)為24位的圖片的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-10-10
  • 關(guān)于使用Python的time庫制作進(jìn)度條程序

    關(guān)于使用Python的time庫制作進(jìn)度條程序

    這篇文章主要介紹了關(guān)于使用Python的time庫制作進(jìn)度條程序,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Python機(jī)器學(xué)習(xí)算法之決策樹算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)

    Python機(jī)器學(xué)習(xí)算法之決策樹算法的實(shí)現(xiàn)與優(yōu)缺點(diǎn)

    決策樹(Decision Tree)是一種基本的分類與回歸方法,這篇文章主要給大家介紹了關(guān)于Python機(jī)器學(xué)習(xí)算法之決策樹算法實(shí)現(xiàn)與優(yōu)缺點(diǎn)的相關(guān)資料,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • Python爬蟲實(shí)戰(zhàn)項(xiàng)目掌握酷狗音樂的加密過程

    Python爬蟲實(shí)戰(zhàn)項(xiàng)目掌握酷狗音樂的加密過程

    在常見的幾個(gè)音樂網(wǎng)站里,酷狗可以說是最好爬取的啦,什么彎都沒有,所以最適合小白入門爬蟲,本篇針對爬蟲零基礎(chǔ)的小白,所以每一步驟我都截圖并詳細(xì)解釋了,其實(shí)我自己看著都啰嗦,歸根到底就是兩個(gè)步驟的請求,還請大佬繞路勿噴
    2021-09-09
  • Python wxPython庫Core組件BoxSizer用法示例

    Python wxPython庫Core組件BoxSizer用法示例

    這篇文章主要介紹了Python wxPython庫Core組件BoxSizer用法,結(jié)合實(shí)例形式分析了wxPython BoxSizer布局管理相關(guān)使用方法及操作注意事項(xiàng),需要的朋友可以參考下
    2018-09-09
  • python中利用xml.dom模塊解析xml的方法教程

    python中利用xml.dom模塊解析xml的方法教程

    這篇文章主要給大家介紹了關(guān)于python中利用xml.dom模塊解析xml的方法教程,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • 使用Python進(jìn)行Excel文件xls/xlsx/xsv格式互相轉(zhuǎn)換

    使用Python進(jìn)行Excel文件xls/xlsx/xsv格式互相轉(zhuǎn)換

    本文介紹了如何使用Python進(jìn)行Excel文件格式的互相轉(zhuǎn)換,包括xls到xlsx、xlsx到xls、xls到csv、xlsx到csv、csv到xls以及csv到xlsx的轉(zhuǎn)換方法,轉(zhuǎn)換過程中需要注意文件路徑的修改以及文件名沖突的處理,需要的朋友可以參考下
    2025-11-11

最新評論

封丘县| 信宜市| 五台县| 宁德市| 南郑县| 探索| 调兵山市| 张掖市| 仁化县| 开阳县| 临江市| 凤山市| 祥云县| 淮阳县| 阿图什市| 德格县| 商都县| 闵行区| 尤溪县| 辽宁省| 且末县| 涟水县| 利津县| 茌平县| 竹溪县| 青川县| 黔江区| 慈溪市| 鄢陵县| 通渭县| 资兴市| 宣威市| 崇文区| 高平市| 淄博市| 乌兰浩特市| 保亭| 中牟县| 武宁县| 井研县| 会理县|