本頁內容
Python 教學:解決日常 Python 問題的實用指南
Python 是一種通用程式語言,應用範圍涵蓋自動化、資料處理、網站後端與科學計算,而大多數人學習 Python 的方式,就是一次解決一個具體的問題。本頁是 DelftStack 上 1,400 多篇 Python 實用指南的總覽地圖。以下各組按照你想完成的工作來分類——清理文字、處理清單與字典、操作檔案與日期、修正錯誤——每一組的開頭都放了編輯精選的指南,專門回答讀者最常提出的問題。無論你正在寫自己的第一支程式,還是平日就維護 Python 程式碼、只是需要一個可靠的答案,都可以從下面的學習路徑開始,或者直接跳到與你的問題相符的那一組。
Python 學習路徑
你不需要把 1,400 篇指南按順序通通讀完。一條可靠的路線是這樣的:先把你的環境設定好,再掌握每天都會用到的資料型別——字串、清單與字典——接著加入檔案、日期與數字,最後才花時間處理錯誤處理與物件導向程式。Python 特別適合這樣的順序,因為每個階段都建立在前一個階段之上:文字處理學好了,檔案操作就變得容易;檔案操作學好了,資料處理就變得容易;而一旦你了解程式原本想做什麼,錯誤訊息就不再神祕。把下面各個階段當成一份檢查清單來使用;當你覺得某個階段已經很輕鬆了,就往下一個階段前進。
- 設定環境。 先安裝 Python,並用 Anaconda 與 Python 版本檢查 確認你正在執行的到底是什麼;版本上的混淆,是許多「安裝壞了」問題回報的來源。
- 核心資料。 學會 把字串轉換為清單,以及 取得字典的第一個鍵——這些型別幾乎出現在每一個程式之中。
- 日常工作。 從檔案中刪除一行、格式化日期時間、計算移動平均:下面各組涵蓋的正是這類日常工作。
- 修正錯誤。 當程式出錯時,ConnectionRefusedError 以及其他錯誤指南會告訴你如何找出原因,而不是靠猜測。
- 更進一步。 檢視物件的屬性,並用 OpenCV 裁切影像;類別與 OpenCV 這兩組,會成為你通往更大專案的橋梁。
走完學習路徑之後,就把這一頁當成參考手冊來使用:下面每一組都是自成一體的,而每個區段下方的完整字母順序索引,列出了全部 1,400 多篇指南,連精選清單涵蓋不了的那些長尾的具體問題也包含在內。
字串與文字
幾乎每一個 Python 程式都會處理到文字:使用者輸入、檔案內容、從網頁爬取的內容、匯出的 CSV 檔案。本組涵蓋你對這些文字會做的四件事——轉換它、清理它、比較它,偶爾也美化它。請先讀轉換指南:把字串變成單字或數值的清單,是通往其他所有操作的入口操作。接下來是清理指南——看不見的字元會帶來令人抓狂的錯誤。最後以比較作結,因為驗證邏輯就住在那裡;而美化的指南,請留到你哪天動手寫命令列工具時再看。
- 在 Python 中把字串轉換為清單 — 若要逐字元拆分就選
list(),要拆成單字與分隔值就選split(),要解析字面文字就選ast.literal_eval()——絕不要對不受信任的輸入使用eval()。 - 在 Python 中列印粗體文字 — 使用原始的 ANSI 跳脫序列讓終端機輸出變成粗體,或使用
termcolor、colorama這類函式庫來達成。 - 在 Python 中從字串移除
\xa0— 使用unicodedata.normalize()與replace(),把爬取文字中看不見的不換行空格清除乾淨。 - 不區分大小寫地比較字串 — 使用
lower()或upper()讓比較不受大小寫影響;當ß與ss這樣的配對也必須視為相同時,就改用casefold()。 - 在 Python 中從字串移除逗號 — 使用
str.replace()移除所有的逗號,或使用re模組處理更複雜的模式。 - 在 Python 中從字串移除標點符號 — 用三種方式清理文字中的標點符號:
string.punctuation篩選、正規表示式,或str.translate()轉換表。
深入學習: Python 字串子中心 將全部 115 篇字串指南按任務整理——轉換、清理、查找與格式化——並提供完整的字串方法地圖。
清單、字典與集合
清單與字典是 Python 預設的容器,對它們的熟練程度,決定了一個程式只是「能運作」,還是一併做到簡短而清晰。請先從字典指南開始:它會把對映中「第一個」的意義——也就是插入順序——以及如何直接讀取一個鍵,一次說清楚。另一個基礎是切片指南。接下來是資料衛生的部分:真實世界的數值清單送到你手上時往往帶著 NaN 值,而在任何建立於其上的分析有意義之前,你必須先找出極值與離散程度在哪裡,並加以量測。
- 取得字典的第一個鍵 — 用
next(iter(d))、轉換為清單,或使用迴圈來取得字典的第一個鍵,並為空字典準備安全的預設值。 - 在 Python 中從清單移除 NaN — 用
math.isnan()或 NumPy 篩除清單中的數值NaN;字面字串'nan'要分開另外處理。 - 取得清單中最大值與最小值的索引 — 用
max()與min()搭配list.index(),找出最大值與最小值所在的位置,或改用 NumPy 的argmax()與argmin()。 - 在 Python 中計算清單的標準差 — 用
statistics.pstdev()或 NumPy 的std()量測一個清單的離散程度——法文搜尋python écart type就會連到這一篇。 - 在 Python 中把清單切成兩半 — 使用切片與
len()把清單分成兩半,或用itertools.islice()以惰性方式切分。
錯誤與例外
錯誤訊息是一份結構化的報告:例外名稱告訴你哪一個假設落空了,錯誤值則告訴你是在哪裡落空的。請按照這個順序來讀這一組。KeyError 表示你的資料裡缺少程式預期的東西;純量 IndexError 表示某個 NumPy 值的維度比預期的還要少。連線錯誤與權限錯誤在性質上不同——程式的邏輯本身沒有問題,但環境拒絕了這個操作,所以修法在於檢查伺服器、連接埠或檔案權限。
- 修正 ConnectionRefusedError: [Errno 111] Connection refused — 依序排查被拒絕的 TCP 連線:伺服器正在執行、介面與連接埠正確、防火牆已經檢查。
- 解決 Python 中的 KeyError 0 — 為什麼
KeyError: 0代表字典中沒有鍵0,以及如何用try/except或dict.get()為查詢加上保護。 - 修正 IndexError: invalid index to scalar variable — 當你對一個已經是純量的值進行索引時,NumPy 拋出的正是這個錯誤;請檢查
ndim與shape,若需要較小的陣列就改用切片。 - 修正 PermissionError: [WinError 5] Access is denied — 透過檢查權限、關閉正在占用檔案的程式、變更擁有權,或以系統管理員身分執行,來修正 Windows 的存取被拒錯誤。
數字、數學與運算子
這一組雖然不大,卻在多種語言中獲得了不成比例的高需求,因為每一篇指南都回答了一個很難打進搜尋框裡的問題。XOR 指南是概念導向的一篇:位元邏輯是旗標、總和檢查碼,以及那個有名的變數交換技巧背後的基礎。移動平均指南則是實務導向的一篇——它是許多讀者人生中的第一個時間序列工具。最後兩篇,則把造成真實錯誤的術語一次講清:歐拉數有三個各自「正確」的函式,而截斷浮點數並不等於把它四捨五入。
- Python 中的 XOR — 將
^用於位元 XOR 與布林 XOR,閱讀真值表,並看看那個變數交換技巧。 - 在 Python 中計算移動平均 — 使用由
convolve或cumsum產生的移動平均來平滑 NumPy 序列,或使用 pandas 與 Bottleneck。 - Python 中的歐拉數 — 將常數取得為
math.e;對純量用math.exp()求冪,對陣列用numpy.exp(),在接近零時則用expm1()。 - 在 Python 中截斷浮點數 — 把浮點數截斷到指定的小數位數,並看清
round()與真正的截斷差在哪裡。
環境與設定
環境問題會阻擋其他一切事情,所以即使這一組的內容都不是「寫程式」本身,它仍然位於整個選集的入口位置。請按照你將會遇到這些問題的順序來處理它們。第一天,先確認你所擁有的 Python 與 conda 到底是什麼——版本檢查指南之所以存在,正是因為那是兩個不同的數字,卻總是被混為一談。當一個專案需要精確的套件版本時,就用 pip 把它鎖定下來;也要記住,pip 安裝的是套件,而不是直譯器。解除安裝的指南,則是為想要從頭來過的時候準備的。
- 檢查 Python 與 Anaconda 版本 — 把這兩個數字分清楚:
conda -V回報的是套件管理工具,python -V回報的是你目前作用中環境的直譯器。 - 完整解除安裝 Miniconda — 在 Windows、macOS 或 Linux 上安全地移除 Miniconda:先匯出環境、驗證安裝前綴,最後才清理殘留檔案。
- 在 Ubuntu 解除安裝 Python — 使用
apt remove從 Ubuntu 移除 Python;purge會一併刪除設定檔,而autoremove會完成收尾工作。 - 不使用 pip 安裝 Python 套件 — 在 pip 無法使用的情況下手動安裝函式庫——從 PyPI 下載原始碼發行檔,再執行
setup.py。 - 用 pip 安裝指定版本的套件 — 使用
python -m pip install PACKAGE==VERSION鎖定一個精確的版本,並在隔離的環境中驗證它。
日期與時間
日期與時間的程式碼看起來微不足道,直到它必須為了另一個系統而格式化、必須可靠地排序,或必須跨時區進行比較為止。這幾篇指南涵蓋了幾乎所有的日常 datetime 工作。格式化排在第一位:毫秒指南是搜尋 python datetime to string 背後所倚賴的參考資料,它也會說明為什麼那個看似方便的切片捷徑會毀掉數值。排序只要你知道 sorted() 接受 datetime 物件,就只是一個函式的事。相減才是微妙之處——它的結果是一個 timedelta,而把 naive 與 aware 的值混在一起會引發錯誤,這種錯誤最好先在這裡遇上。
- 把 datetime 轉換為帶毫秒的字串 — 透過
isoformat(timespec="milliseconds"),或strftime()搭配%f,把 datetime 格式化為剛好三位數毫秒的表示。 - 在 Python 中排序日期與時間 — 使用
sorted()排序日期與時間,從日期字串到datetime物件的清單,任一方向都可以。 - 在 Python 中把 datetime 相減 — 將一個 datetime 減去另一個 datetime 得到
timedelta,再透過total_seconds()以秒、分鐘或小時來讀取它。
檔案、資料格式與系統
Python 中的檔案工作遵循同一個模式——讀取、轉換、寫回——而刪除行的指南正是這個模式的典型範例,其中也包含了檔案太大、無法一次全部載入記憶體時的記憶體安全版本。這一組的另一半,談的是程式碼住在哪裡:為什麼裝滿模組的資料夾需要有套件結構,以及當模組名稱事先未知時,動態載入是如何運作的。wheel 指南則把這個環節收尾——.whl 檔案是套件抵達沒有索引的機器的途徑,這在受管制的伺服器上是很常見的情況。
- 在 Python 中從檔案刪除一行 — 透過讀取、篩選再寫回,依行號刪除行,或只刪除第一行或最後一行——大檔案則使用串流方式處理。
- 匯入目錄中的所有模組 — 把一個資料夾當成套件,載入其中的每一個模組:使用明確的
__init__.py匯入,或用importlib進行探索。 - 安裝 Python 套件的 .whl 檔案 — 從檔名上的相容性標籤開始,用
python -m pip install安裝本機的.whl檔案。
函式、類別與物件
這一組是刻意精選過的:三篇指南,每一篇都通往一個更大的主題。sigmoid 指南是通往機器學習的橋梁——它從零實作這個活化函式,包括那個樸素公式所缺少的、在數值上穩定的形式。屬性指南其實是一項偽裝起來的除錯技能:大多數除錯工作的起點,就是先把物件實際持有的內容印出來,而 Python 提供了四種檢視它的方式。類別變數指南,則解決了一個長期存在的初學者困惑:在類別主體中定義的變數由所有實例共享,而且與 global 毫無關係。
- Python 的 sigmoid 函式 — 使用
math.exp()實作 sigmoid 函式,讓它在數值上保持穩定,處理陣列時則改用 NumPy 或 SciPy 的expit。 - 在 Python 中列印物件的屬性 — 用四種方式檢視一個物件:點號存取、
getattr()、保存儲存資料的__dict__,以及列出一切的dir()。 - 在 Python 中定義類別全域變數 — 在類別主體中定義一個類別變數,以
ClassName.attribute的方式讀取它——並看清global為何與它完全是兩回事。
OpenCV 與影像
OpenCV 是 Python 選集當中一個獨立的興趣群集——它屬於影像處理,而不是一般程式設計——所以它在這裡得到一個專注的區段,日後還會有一篇專門的子指南。順序在這裡很重要。裁切排在第一位,是因為它教了那個核心觀念:OpenCV 的影像就是 NumPy 陣列,而大多數操作都是陣列操作。矩形偵測在這個基礎上加入了輪廓,那是尋找形狀的標準方法。使用 solvePnP 的姿態估計則是進階的一篇,它結合了 2D 影像點、3D 模型點與相機校正。
- 在 Python 中使用 OpenCV 裁切影像 — 透過對 NumPy 陣列進行切片、定義感興趣的區域,或用滑鼠互動選取,來裁切一張影像。
- 使用 OpenCV 的 solvePnP() 函式 — 透過相機矩陣與標記點,使用
cv2.solvePnP從 2D–3D 點對應關係估計物體的姿態。 - 在 OpenCV 中偵測矩形 — 透過尋找輪廓、依面積排序並保留四個角的多邊形來偵測矩形,另一種替代方法是
HoughLinesP()。
常見問題
如何在 Python 中把字串轉換為清單?
這取決於每個元素應該是什麼樣子。呼叫 split() 可以得到單字,或呼叫 split(",") 得到以逗號分隔的值。使用 list(text),可以得到一個字元一個元素。對於裝著 "[1, 2, 3]" 這類 Python 字面語法的文字,請用 ast.literal_eval() 來解析它,而不是 eval()。字串轉清單指南 涵蓋了每一種情況,包括附帶引號的 CSV 欄位。
[:-1] 在 Python 中有什麼作用?
[:-1] 是一個切片,意思是「從開頭開始,一直到最後一個元素之前為止,但不包含最後一個元素」。套用在字串上,它會傳回除了最後一個字元之外的每一個字元;套用在清單上,則會傳回一個去掉最後一項的新清單。切片會建立一個新的物件,這正是 [:-1] 成為捨棄尾端換行符號的標準做法的原因。
如何修正 ConnectionRefusedError [Errno 111]?
這個錯誤表示 TCP 連線被主動拒絕:通常這代表在你的用戶端所使用的位址與連接埠上,沒有任何程式在監聽。請先啟動伺服器,然後確認用戶端指向相同的位址與連接埠。綁定在 127.0.0.1 的伺服器只接受來自同一台機器的連線;若是另一台電腦,請檢查防火牆。ConnectionRefusedError 指南 會依序帶你完成這些檢查。
如何檢查我的 Anaconda / Python 版本?
開啟 Anaconda Prompt,對 conda 版本執行 conda -V,對 Python 版本執行 python -V——這是兩個不同的數字,而混淆它們正是人們最常犯的錯。Python 的結果反映的是該提示字元目前作用中的環境,所以請先啟用你的專案環境。conda list 會顯示兩邊的套件列,而 conda info 會印出兩個版本。詳情請見 Anaconda 版本檢查指南。
如何從字串中移除 \xa0?
\xa0 是不換行空格:一個看起來像空格、但與一般空格比較時並不相等的 Unicode 字元,它通常出現在從網頁或 PDF 複製而來的文字裡。有兩個可靠的移除方法:unicodedata.normalize("NFKD", text),它會把 \xa0 分解成一般空格;以及 text.replace("\xa0", " ")。把字元換成空格,比直接把它刪除來得安全,這樣相連的單字就不會黏在一起。\xa0 移除指南 對這些方法做了比較。
如何移除 Python(Ubuntu / Windows / Miniconda)?
正確的方法取決於 Python 當初是如何安裝的。在 Ubuntu 上,sudo apt-get remove python3 會移除這個套件;purge 會一併刪除設定檔,而 autoremove 會清除孤兒套件。對於 Miniconda,請先匯出你想保留的環境,再使用官方的解除安裝程式,並且在動手刪除之前先確認安裝前綴。這兩種情況都分別在 Ubuntu 解除安裝指南 與 Miniconda 解除安裝指南 裡有完整的說明。
下一步
上面有兩組正在成長為專門的子指南:字串與文字,本選集中最常被點擊的一組;以及錯誤與例外,讀者帶著急迫問題抵達的一組。在這些子指南上線之前,上面對應的區段就是入口。若你的工作轉向了靜態型別語言或另一個不同的生態系,請繼續前往 Java 實用指南 或 C# 實用指南。