Python讀取多個TXT文件并提取指定列寫入Excel
本文將實現(xiàn)批量讀取指定文件夾下的所有 TXT 文件,提取每個文件中指定列的所有值,并將結果寫入 Excel(支持按文件分 Sheet、或合并到單個 Sheet)。核心使用pandas(高效處理文本 / 表格數(shù)據(jù))和openpyxl(Excel 寫入引擎),兼顧簡潔性和通用性。
一、前置準備
1. 安裝依賴庫
執(zhí)行以下命令安裝所需庫:
pip install pandas openpyxl
pandas:快速讀取 TXT 文件、提取列數(shù)據(jù);openpyxl:支持寫入.xlsx 格式 Excel 文件(pandas 默認依賴)。
2. 明確 TXT 文件格式
需先確認 TXT 文件的分隔符(常見類型):
- 空格分隔(如
1 張三 20); - 制表符分隔(
\t,如1\t張三\t20); - 逗號分隔(如
1,張三,20); - 其他分隔符(如
|、;)。
二、核心代碼實現(xiàn)
場景 1:所有 TXT 結構一致,提取指定列(合并到 Excel 單個 Sheet)
適用于所有 TXT 文件的列數(shù)、列順序完全相同,提取同一列(如第 2 列)并匯總到 Excel 的一個 Sheet 中,標注數(shù)據(jù)來源文件。
import os
import pandas as pd
def txt_col_to_excel(
txt_folder, # TXT文件所在文件夾路徑
excel_path, # 輸出Excel文件路徑(如"result.xlsx")
target_col_index, # 要提取的列索引(從0開始,如第2列填1)
sep="\s+", # TXT文件分隔符,默認匹配任意空格(含多個空格/制表符)
encoding="utf-8" # TXT文件編碼(常見gbk/utf-8)
):
"""
批量讀取TXT文件,提取指定列寫入Excel單個Sheet
"""
# 初始化匯總數(shù)據(jù)列表
all_data = []
# 遍歷文件夾下所有TXT文件
for filename in os.listdir(txt_folder):
# 僅處理.txt后綴文件
if not filename.endswith(".txt"):
continue
# 拼接完整文件路徑
txt_path = os.path.join(txt_folder, filename)
print(f"正在處理文件:{filename}")
try:
# 1. 讀取TXT文件為DataFrame
# sep="," 對應逗號分隔;sep="\t" 對應制表符;sep="|" 對應豎線分隔
df = pd.read_csv(
txt_path,
sep=sep,
encoding=encoding,
header=None, # TXT無表頭時設為None,有表頭則設為0
on_bad_lines="skip" # 跳過格式錯誤的行
)
# 2. 提取指定列,添加"來源文件"列便于溯源
target_col = df.iloc[:, target_col_index] # iloc[:,n] 提取第n列(索引從0開始)
temp_df = pd.DataFrame({
"來源文件": filename,
"目標列數(shù)據(jù)": target_col
})
# 3. 追加到匯總列表
all_data.append(temp_df)
except Exception as e:
print(f"處理文件 {filename} 失?。簕e}")
continue
# 4. 合并所有數(shù)據(jù)并寫入Excel
if all_data:
final_df = pd.concat(all_data, ignore_index=True)
# index=False 不寫入行索引;engine="openpyxl" 支持.xlsx格式
final_df.to_excel(excel_path, sheet_name="匯總數(shù)據(jù)", index=False, engine="openpyxl")
print(f"所有數(shù)據(jù)已寫入Excel:{excel_path}")
else:
print("未找到有效TXT文件或提取數(shù)據(jù)為空!")
# 示例調用
if __name__ == "__main__":
# 配置參數(shù)(根據(jù)實際情況修改)
TXT_FOLDER = r"E:\test_txt" # TXT文件所在文件夾(絕對路徑)
EXCEL_PATH = "提取結果.xlsx" # 輸出Excel路徑
TARGET_COL_INDEX = 1 # 提取第2列(索引從0開始)
SEP = "\s+" # TXT分隔符(如逗號分隔則改為",")
ENCODING = "utf-8" # 若TXT亂碼,嘗試改為"gbk"
# 執(zhí)行函數(shù)
txt_col_to_excel(TXT_FOLDER, EXCEL_PATH, TARGET_COL_INDEX, SEP, ENCODING)
場景 2:按 TXT 文件分 Sheet 寫入 Excel
若希望每個 TXT 文件的指定列單獨存入 Excel 的一個 Sheet(Sheet 名 = TXT 文件名),修改核心邏輯如下:
import os
import pandas as pd
def txt_col_to_excel_by_sheet(
txt_folder,
excel_path,
target_col_index,
sep="\s+",
encoding="utf-8"
):
# 創(chuàng)建Excel寫入器
with pd.ExcelWriter(excel_path, engine="openpyxl") as writer:
for filename in os.listdir(txt_folder):
if not filename.endswith(".txt"):
continue
txt_path = os.path.join(txt_folder, filename)
print(f"正在處理文件:{filename}")
try:
df = pd.read_csv(
txt_path,
sep=sep,
encoding=encoding,
header=None,
on_bad_lines="skip"
)
# 提取指定列,重命名列名
target_df = df.iloc[:, [target_col_index]] # 保留列結構
target_df.columns = ["目標列數(shù)據(jù)"]
# Sheet名:去掉.txt后綴
sheet_name = filename.replace(".txt", "")
# 寫入對應Sheet
target_df.to_excel(writer, sheet_name=sheet_name, index=False)
except Exception as e:
print(f"處理文件 {filename} 失?。簕e}")
continue
print(f"所有文件已分Sheet寫入Excel:{excel_path}")
# 示例調用
if __name__ == "__main__":
TXT_FOLDER = r"E:\test_txt"
EXCEL_PATH = "按文件分Sheet結果.xlsx"
TARGET_COL_INDEX = 1
SEP = "\s+"
ENCODING = "utf-8"
txt_col_to_excel_by_sheet(TXT_FOLDER, EXCEL_PATH, TARGET_COL_INDEX, SEP, ENCODING)
三、關鍵參數(shù)說明
| 參數(shù) | 說明 | |
|---|---|---|
txt_folder | TXT 文件所在文件夾路徑,建議用絕對路徑(如r"E:\data\txt"),避免路徑錯誤 | |
target_col_index | 目標列索引(從 0 開始),例如第 1 列填 0、第 3 列填 2 | |
sep | TXT 分隔符:- 空格分隔:sep="\s+"(匹配 1 個或多個空格)- 制表符:sep="\t"- 逗號:sep=","- 豎線:`sep=" | "` |
encoding | TXT 文件編碼,Windows 默認 ANSI 對應gbk,UTF-8 文件填utf-8 | |
header | 若 TXT 文件有表頭(如第一行是 "序號,姓名,年齡"),設為header=0,否則None |
四、常見問題解決
1. TXT 讀取亂碼
- 原因:編碼不匹配(如文件是 gbk 編碼,代碼用 utf-8 讀?。?/li>
- 解決:將
encoding改為gbk,或用chardet庫檢測文件編碼:
import chardet
with open("test.txt", "rb") as f:
result = chardet.detect(f.read())
print("文件編碼:", result["encoding"]) # 輸出如gbk/utf-8
2. 列索引越界報錯
- 原因:指定的
target_col_index超過 TXT 文件的列數(shù); - 解決:先打印 TXT 文件的列數(shù),確認索引:
df = pd.read_csv("test.txt", sep="\s+", header=None)
print("TXT文件列數(shù):", df.shape[1]) # 輸出列數(shù),索引范圍0~列數(shù)-1
3. 部分行跳過(on_bad_lines="skip")
- 原因:TXT 中部分行格式錯誤(如列數(shù)不一致);
- 解決:若需保留所有行,可去掉該參數(shù),手動排查格式錯誤行。
五、擴展優(yōu)化
支持子文件夾遍歷:若 TXT 文件分布在子文件夾中,用os.walk替換os.listdir:
for root, dirs, files in os.walk(txt_folder):
for filename in files:
if filename.endswith(".txt"):
txt_path = os.path.join(root, filename)
# 后續(xù)處理邏輯不變
數(shù)據(jù)去重 / 清洗:提取列后可添加去重邏輯:
target_df = target_df.drop_duplicates() # 去重 target_df = target_df.dropna() # 刪除空值行
追加寫入 Excel:若需向已有 Excel 追加數(shù)據(jù),可先讀取原有數(shù)據(jù),再合并后寫入。
該方案兼顧通用性和易用性,適用于大多數(shù)結構化 TXT 文件的列提取場景,可根據(jù)實際需求調整分隔符、編碼、列索引等參數(shù)。
以上就是Python讀取多個TXT文件并提取指定列寫入Excel的詳細內容,更多關于Python讀取多個TXT并寫入Excel的資料請關注腳本之家其它相關文章!
相關文章
對DJango視圖(views)和模版(templates)的使用詳解
今天小編就為大家分享一篇對DJango視圖(views)和模版(templates)的使用詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07
Django全局啟用登陸驗證login_required的方法
這篇文章主要介紹了Django全局啟用登陸驗證login_required的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06
python實現(xiàn)搜索指定目錄下文件及文件內搜索指定關鍵詞的方法
這篇文章主要介紹了python實現(xiàn)搜索指定目錄下文件及文件內搜索指定關鍵詞的方法,可實現(xiàn)針對文件夾及文件內關鍵詞的搜索功能,需要的朋友可以參考下2015-06-06
Python使用py2neo操作圖數(shù)據(jù)庫neo4j的方法詳解
這篇文章主要介紹了Python使用py2neo操作圖數(shù)據(jù)庫neo4j的方法,結合實例形式詳細分析了Python使用py2neo操作圖數(shù)據(jù)庫neo4j的具體步驟、原理、相關使用技巧與操作注意事項,需要的朋友可以參考下2020-01-01
python使用paramiko實現(xiàn)ssh的功能詳解
這篇文章主要介紹了python使用paramiko實現(xiàn)ssh的功能詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-03-03
基于python代碼實現(xiàn)簡易濾除數(shù)字的方法
今天小編就為大家分享一篇基于python代碼實現(xiàn)簡易濾除數(shù)字的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07

