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

