【问题标题】:How would I extract & organize data from a txt file using python?如何使用 python 从 txt 文件中提取和组织数据?
【发布时间】:2022-01-13 21:10:23
【问题描述】:

情况:我有一个包含各种元素的平面数据文件,我需要提取特定部分。我是 Python 的初学者,使用正则表达式和其他函数将其写出来。这是我收到的 txt 文件中的数据示例:


**ACCESSORID = FS01234**   TYPE       = USER      SIZE         =     1024  BYTES
**NAME       =    JOHN SMITH**                                                                                                                                                              FACILITY   = TSO                                                                                                                    
 DEPT ACID  = D12RGRD  DEPARTMENT = TRAINING                                                                       
 DIV ACID   = NR       DIVISION   = NRE                                                                               
 CREATED    = 01/17/05  00:00  LAST MOD   = 11/16/21  10:42                                                                          
 **PROFILES   = VPSNRE     P11NR00A**                                                                                                     
 LAST USED  = 12/02/21 09:03 CPU(SYSB) FAC(SUPRSESS) COUNT(06051)                                                                    
 **XA SSN     = 123456789**                                     OWNER(JB112)                                                          
 XA TSOACCT = 123456789                                    OWNER(JB112 )                                                          
 XA TSOAUTH = JCL                                           OWNER(JB112  )                                                          
 XA TSOAUTH = RECOVER                                       OWNER(JB112 )                                                          
 XA TSOPROC = NR005PROC                                      OWNER(JB112 )                                                          
 -----------  SEGMENT TSO                                                                                                            
 TRBA       = NON-DISPLAY FIELD                                                                                                 
 TSOCOMMAND =                                                                                                                        
 TSODEFPRFG =                                                                                                                        
 TSOLACCT   = 111111111                                                                                                            
 TSOLPROC   = NR9923PROC                                                                                                               
 TSOLSIZE   = 0004096                                                                                                                
 TSOOPT     = MAIL,NONOTICES,NOOIDCARD                                                                                               
 TSOUDATA   = 0000                                                                                                                   
 TSOUNIT    = SYSDD                                                                                                                  
 TUPT       = NON-DISPLAY FIELD   
----------- SEGMENT USER
**EMAIL ADDR = john.smith@nre.ago.com**                                                                                               

我需要提取的部分以粗体显示。我知道我需要提供到目前为止我所做的并且没有发布我的整个脚本,这是我正在做的提取 ACCESSORID = FS01234NAME = JOHN SMITH部分。

def RemoveSpace():
    f = open("PROJECTFILE.txt","r")
    f1 = open("RemoveSpace.txt", "w")
    data1 = f.read()
    word = data1.split()
    s = ' '.join(word)
    f1.write(s)
    print("Data Written Successfully")
    RemoveSpace()


f = open(r"C:\Users\user\Desktop\HR\PROJECTFILE\RemoveSpace.txt".format(g), "r").read()

TSS = []

 contents = re.split(r"ACCESSORID =",f)
 contents.pop(0)

for item in contents:
TSS_DICT = {}

emplid = re.search(r"FS.*", item)

if emplid is not None:
    s_emplid = re.search("FS\w*", emplid.group())
else:
    s_emplid = None
    
if s_emplid is not None:
    s_emplid = s_emplid.group()
else:
    s_emplid = None

TSS_DICT["EMPLOYEE ID"] = s_emplid

name = re.search(r"NAME =.*", item)

if name is not None:
    emp_name = re.search("[^NAME = ][^,]*", name.group())
else:
    emp_name = None

if emp_name is not None:
    emp_name = emp_name.group()
else:
    emp_name = None

TSS_DICT["EMPLOYEE NAME"] = emp_name

问题:我很难得到 John Smith。在 John Smith 之后,它不断地将所有内容引入电子邮件地址的最后一行。我的最终目标是获得一个 CSV 文件,其中每个粗体项目作为自己的列。更直接地说,专家将如何使用这种数据清理方法来简化流程?如果需要,我可以发布完整的代码,但不想再把它弄混了。

【问题讨论】:

  • 在像'NAME = JOHN SMITH FACILITY = TSO' 这样的部分的情况下,你怎么知道它应该被拆分为'name': 'john smith''facility': 'tso' 而不是'name': 'john''smith facility': 'tso'Smith 之后似乎没有换行符,那你怎么知道分组呢?是否知道所有可能的键?并不是说键都是单个单词,例如XA TSOAUTH。还是您歪曲了数据,我们是否在示例中遗漏了一些特殊字符和换行符?
  • @Grismar - 当我在草稿中发布时,它与文本文件一样具有所有空格,但在最后的帖子中,它似乎都彼此相邻。需要的字段是 ACCESSOR ID = xxxxxx NAME = xxxxx xxxxx PROFILES = xxxxxxx XA SSN = xxxxxxxx EMAIL ADDR = xxxxxxxx 如果需要,我可以发布文件的确切外观的屏幕截图。感谢您抽出宝贵时间阅读!
  • 每条记录在文本中都需要一个开始和结束。记录中的每个字段都需要一个关键字和一个捕获组值。每场比赛都是一个记录。问题是可变的值。具体来说,某人的姓名和电子邮件地址。但是,任何其他可以有多个部分的字段都是一个潜在的问题。请记住,正则表达式与“人”的眼睛不匹配。
  • 谢谢你的好建议!

标签: python regex extract


【解决方案1】:

为了练习你的正则表达式,我建议使用像RegExr 这样的网站。在这里,您可以粘贴您想要匹配的文本,并且可以使用不同的匹配表达式来获得您想要的结果。

假设您想将此代码用于同一组织的多个文件,并且每个文件中的数据格式相同,则可以大大简化您的代码。

假设我们想从文本文件中提取NAME = JOHN SMITH。我们可以编写以下 Python 代码来执行此操作:

import re
pattern = "NAME = \\w+ \\w+"
name = re.findall(pattern, text_to_search)[0][7:]
print(name)

pattern 是我们的正则表达式搜索表达式。 text_to_search 是您已读入 Python 脚本的文本文件。 re.findall() 返回匹配项的列表,然后我们使用[0] 访问其第一个索引。然后我们可以使用字符串切片 ([7:]) 来删除 NAME = 位。

以上代码将输出以下内容:

JOHN SMITH

您应该能够将相同的原则应用于文本文件的其他粗体部分。

就将提取的数据写入 CSV 文件而言,可能值得阅读一个很好的教程。例如Reading and Writing CSV Files in Python。在写作之前有几种不同的方式来存储你的信息,例如列表与字典。但是您可以使用内置 Python 工具或手动编写 CSV 文件。

【讨论】:

  • 非常感谢您的回复。写得很好,很有帮助!
  • @BailSpin 如果这回答了您的问题,请在答案处标记,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 2019-05-05
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多