一、文件基礎
-
打開與關閉
- 推薦用
with open(path, mode, encoding='utf-8') as f:
,自動完成close()
,避免泄露文件句柄。 - 常見模式:
'r'
讀,'w'
寫覆蓋,'a'
追加,'rb'
/'wb'
二進制。 - Windows 默認編碼為 GBK,Linux/Mac 為 UTF-8;跨平臺腳本務必顯式指定 encoding。
- 推薦用
-
文本讀寫
f.read()
一次讀全部;f.readline()
逐行;f.readlines()
得列表。- 追加寫入:
with open('test.txt','a',encoding='utf-8') as f: f.write('xxx')
。
-
路徑與編碼錯誤
- 絕對路徑:
C:/Users/...
(正斜杠或雙反斜杠)。 - 相對路徑:以腳本所在目錄為基準,可用
os.path.join()
拼接。 - 遇到
UnicodeDecodeError
時,嘗試encoding='utf-8-sig'
或'gbk'
。
- 絕對路徑:
二、PDF 處理(PyPDF2 + pdfplumber 組合拳)
- 環境準備
pip install PyPDF2 pdfplumber pandas -i https://pypi.tuna.tsinghua.edu.cn/simple
- 讀取文字
import pdfplumberwith pdfplumber.open('demo.pdf') as pdf:for page in pdf.pages:print(page.extract_text())
- 讀取表格
all_tables = []with pdfplumber.open('demo.pdf') as pdf:for p in pdf.pages:for table in p.extract_tables():all_tables.extend([row for row in table if any(row)])df = pd.DataFrame(all_tables)df.to_excel('pdf_table.xlsx', index=False, header=False)
- 合并 PDF(PyPDF2)
from PyPDF2 import PdfMergermerger = PdfMerger()for pdf in ['1.pdf', '2.pdf']:merger.append(pdf)merger.write('merged.pdf')merger.close()
- 添加水印(注意層級順序)
from PyPDF2 import PdfFileReader, PdfFileWriterbase = PdfFileReader('src.pdf')watermark = PdfFileReader('water.pdf').getPage(0)writer = PdfFileWriter()for i in range(base.getNumPages()):page = base.getPage(i)# 先底層內容,后水印;若水印被文字遮擋,可調整水印透明度或在生成水印 PDF 時放到底層page.mergePage(watermark) # mergePage 會把兩頁疊加,watermark 在上層writer.addPage(page)with open('res_watermarked.pdf', 'wb') as f:writer.write(f)
課堂踩坑:水印蓋字 → 在水印 PDF 里把文字透明度降低或置底后再合并。
- Word → PDF(Windows 專用,pypiwin32)
import win32com.client as win32word = win32.Dispatch('Word.Application')doc = word.Documents.Open(r'C:\abs\path\template.docx')doc.ExportAsFixedFormat('template.pdf', 17) # 17=pdfdoc.Close(); word.Quit()
三、實戰小結
- 文件操作牢記 with+encoding;PDF 處理分清 pdfplumber(讀取)與 PyPDF2(編輯)。
- 合并、加水印前先用小文件調試,避免一次性加載大 PDF 導致內存爆炸。
- 路徑/編碼問題優先排查打印
os.getcwd()
與顯式 encoding。