Python脚本开发求助:从文本文件提取多字段生成CSV
Python脚本:从文本文件提取数据到CSV
完整脚本
import re import csv # 定义需要提取的所有字段及其匹配规则 FIELD_PATTERNS = { "CustomerNAME": r"<CustomerNAME>\s*(.*)", "DOA": r"<DOA>\s*(.*)", "Account": r"<Account>\s*(.*)", "DateofPurchase": r"<DateofPurchase>\s*(.*)", "Manager": r"Manager:\s*(.*?)(?=\n\S|$)", "Requesting Staff": r"Requesting Staff:\s*(.*?)(?=\n\S|$)", "Class Name": r"Class Name:\s*(.*?)(?=\n\S|$)", "Modle Name": r"Modle Name:\s*(.*?)(?=\n\S|$)", "Indication for Lease": r"Indication for Lease:\s*(.*?)(?=\n\S|$)", "Expected Duration of Lease": r"Expected Duration of Lease:\s*(.*?)(?=\n\S|$)", "Cost of Lease": r"Cost of Lease:\s*(.*?)(?=\n\S|$)", "Availability of item": r"Availability of item :\s*(.*?)(?=\n\S|$)", "Availabilty of item": r"Availabilty of item :\s*(.*?)(?=\n\S|$)", # 处理拼写差异 "Decision": r"Decision:\s*(.*?)(?=\n\S|$)", "Rationale for Approval": r"Rationale for Approval:\s*(.*?)(?=\n\S|$)", "Comment": r"Comment:\s*(.*?)(?=\n\s*<<END OF REPORT>>|$)", } def extract_data_from_text(text): # 分割出每个条目:<NEW FILE> 到 <<END OF REPORT>> entries = re.findall(r"<NEW FILE>(.*?)<<END OF REPORT>>", text, re.DOTALL) data = [] for entry in entries: entry_data = {} for field_name, pattern in FIELD_PATTERNS.items(): match = re.search(pattern, entry, re.DOTALL) if match: # 去除前后空白,处理多行注释 value = match.group(1).strip() # 替换换行符为空格(针对多行Comment) value = re.sub(r"\s+", " ", value) entry_data[field_name] = value else: entry_data[field_name] = "" # 字段不存在时留空 # 合并拼写不同的库存字段(示例中有Availability/Availabilty) if entry_data.get("Availabilty of item"): entry_data["Availability of item"] = entry_data.pop("Availabilty of item") data.append(entry_data) return data def write_to_csv(data, output_file): # 获取所有字段名作为CSV表头 fieldnames = [key for key in FIELD_PATTERNS.keys() if key != "Availabilty of item"] with open(output_file, "w", newline="", encoding="utf-8") as csvfile: writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() writer.writerows(data) if __name__ == "__main__": # 读取输入文本文件 with open("input.txt", "r", encoding="utf-8") as f: text_content = f.read() # 提取数据 extracted_data = extract_data_from_text(text_content) # 写入CSV write_to_csv(extracted_data, "output.csv") print("数据提取完成,已保存到output.csv")
关键步骤解释
定义字段匹配规则:
- XML风格标签(如
<CustomerNAME>)直接匹配标签后的内容 - 普通文本标签(如
Manager:)用(?=\n\S|$)作为终止条件,自动匹配标签后到下一个非空行或条目结束的内容,兼容标签同行/下一行的情况 - 单独处理
Comment字段,匹配直到<<END OF REPORT>>的多行文本
- XML风格标签(如
分割条目:
- 用
re.findall结合re.DOTALL(让.匹配换行符),精准提取每个<NEW FILE>到<<END OF REPORT>>之间的内容
- 用
数据清洗:
- 用
strip()去除字段值前后空白 - 多行文本(如Comment)将换行和多空格替换为单个空格
- 合并拼写差异字段(示例中的
Availability/Availabilty)
- 用
写入CSV:
- 使用
csv.DictWriter自动生成表头和每行数据,确保每条条目对应CSV的一行,缺失字段留空
- 使用
使用说明
- 将你的文本文件保存为
input.txt,和脚本放在同一目录 - 运行脚本后,生成
output.csv文件,所有字段按表头排列
内容的提问来源于stack exchange,提问作者NickO
相关产品推荐
相关产品推荐

