本文将实现批量读取指定文件夹下的所有 txt 文件,提取每个文件中指定列的所有值,并将结果写入 excel(支持按文件分 sheet、或合并到单个 sheet)。核心使用pandas(高效处理文本 / 表格数据)和openpyxl(excel 写入引擎),兼顾简洁性和通用性。
一、前置准备
1. 安装依赖库
执行以下命令安装所需库:
pip install pandas openpyxl
pandas:快速读取 txt 文件、提取列数据;openpyxl:支持写入.xlsx 格式 excel 文件(pandas 默认依赖)。
2. 明确 txt 文件格式
需先确认 txt 文件的分隔符(常见类型):
- 空格分隔(如
1 张三 20); - 制表符分隔(
\t,如1\t张三\t20); - 逗号分隔(如
1,张三,20); - 其他分隔符(如
|、;)。
二、核心代码实现
场景 1:所有 txt 结构一致,提取指定列(合并到 excel 单个 sheet)
适用于所有 txt 文件的列数、列顺序完全相同,提取同一列(如第 2 列)并汇总到 excel 的一个 sheet 中,标注数据来源文件。
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
"""
# 初始化汇总数据列表
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,
"目标列数据": target_col
})
# 3. 追加到汇总列表
all_data.append(temp_df)
except exception as e:
print(f"处理文件 {filename} 失败:{e}")
continue
# 4. 合并所有数据并写入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="汇总数据", index=false, engine="openpyxl")
print(f"所有数据已写入excel:{excel_path}")
else:
print("未找到有效txt文件或提取数据为空!")
# 示例调用
if __name__ == "__main__":
# 配置参数(根据实际情况修改)
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"
# 执行函数
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"
):
# 创建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 = ["目标列数据"]
# 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)
三、关键参数说明
| 参数 | 说明 | |
|---|---|---|
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 读取);
- 解决:将
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 文件的列数; - 解决:先打印 txt 文件的列数,确认索引:
df = pd.read_csv("test.txt", sep="\s+", header=none)
print("txt文件列数:", df.shape[1]) # 输出列数,索引范围0~列数-1
3. 部分行跳过(on_bad_lines="skip")
- 原因:txt 中部分行格式错误(如列数不一致);
- 解决:若需保留所有行,可去掉该参数,手动排查格式错误行。
五、扩展优化
支持子文件夹遍历:若 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)
# 后续处理逻辑不变
数据去重 / 清洗:提取列后可添加去重逻辑:
target_df = target_df.drop_duplicates() # 去重 target_df = target_df.dropna() # 删除空值行
追加写入 excel:若需向已有 excel 追加数据,可先读取原有数据,再合并后写入。
该方案兼顾通用性和易用性,适用于大多数结构化 txt 文件的列提取场景,可根据实际需求调整分隔符、编码、列索引等参数。
以上就是python读取多个txt文件并提取指定列写入excel的详细内容,更多关于python读取多个txt并写入excel的资料请关注代码网其它相关文章!
发表评论