【问题标题】:How to read then parse with split and write into a text file?如何读取然后使用拆分解析并写入文本文件?
【发布时间】:2019-09-21 16:28:07
【问题描述】:

我正在努力让 readline() 和 split() 像我期望的那样一起工作。我正在尝试使用 .split(')') 从文本文件中删除一些数据并将其中一些数据写入下一个文本文件。

我已尝试从行中编写所有内容。 我已经尝试 [cnt % 2] 来达到我的预期。

   line = fp.readline()
   fw = open('output.txt', "w+")
   cnt = 1
   while line:
       print("Line {}: {}".format(cnt, line.strip()))
       line = fp.readline()
       line = line.split(')')[0]
       fw.write(line + "\n")
       cnt += 1

来自我正在读取的文本文件的示例。

WELD 190 制造 I MasterCAM 简介 (3) 1½ 小时讲座 - 4½ 小时实验室 注意:交叉列为 DT 190/ENGR 190/IT 190 本课程将向学生介绍 MasterCAM 和 2D 和基本 3D 造型。学生将收到所需零件的说明和图纸 2 轴或 3 轴加工。学生将设计、建模、编程、设置和运行 他们在各种机器上的零件,包括等离子切割机、水射流切割机和 铣床。 WELD 197 焊接技术主题 (.5 - 3)

我离真正有效地抓取这些数据还有很长的路要走,但我正在努力开始。

我的目标是只提取类名和编号并删除描述。

一如既往的感谢!

【问题讨论】:

  • 您要提取哪些类名?每个类名还是第一个?
  • 课程名称是WELD 190,还是课程代码为WELD 190,课程名称为Manufacturing I Introduction to MasterCAM?
  • @Enthus3d 对造成误解深表歉意。
  • 啊,我明白了。如果您要解析该长度的文件,这似乎是一项艰巨的任务。我想您也许可以使用 _(2+CapitalChars)_(2+Nums)_(Class Name)_(1Num) 的正则表达式来获取具有该结构的每门课程,但摆脱重复项这可能会很痛苦。 [这里](regexr.com/4le96) 是我根据您的文件制作的示例。它无法处理换行符,但 regexr 网站是我在 Uni regex-heavy 课程之一中经常使用的。祝你好运!
  • 哦,完全没问题。使用在线翻译很容易做到这一点。是的,语法是相当通用的,尽管不同的语言对特性的支持程度不同。

标签: python split io readline modulus


【解决方案1】:

我相信可以解决您当前的问题,如果您只尝试解析一行,您只需将第二行 line = fp.readline() 移动到 while 循环的末尾。目前,您实际上是从第二行开始解析,因为您已经在示例代码的第一行中使用了readline

修改后的样子是这样的:

   line = fp.readline() # read in the first line
   fw = open('output.txt', "w+")
   cnt = 1
   while line:
       print("Line {}: {}".format(cnt, line.strip()))
       line = line.split(')')[0]
       fw.write(line + "\n")
       cnt += 1
       line = fp.readline() # read in next line after parsing done

示例输入文本的输出:

WELD 190 制造 I MasterCAM 简介 (3

【讨论】:

    【解决方案2】:

    假设您的其他类文本块与您展示的具有相同的结构,您可能希望使用正则表达式来提取类名和类号:

    以下我假设每个文本块都包含“XX 小时讲座”信息,顺序相同,其中“XX”代表任何类型的数字(时间范围)。在变量“match_re”中,我定义了一个正则匹配表达式以仅匹配定义的点“XX 小时讲座”。通过使用“match.group(2)”,我将匹配限制在最里面的括号对中的部分。

    因为我不知道你的整个文本文件,所以下面的匹配表达式可能对你来说还不完整。

    下面我提取字符串:WELD 190 Manufacturing I Introduction to MasterCAM (3)

    import re
    
    string = "WELD 190 Manufacturing I Introduction to MasterCAM (3) 1½ hours lecture - 4½ hours laboratory Note: Cross listed as DT 190/ENGR 190/IT 190 This course will introduce the students to MasterCAM and 2D and basic 3D modeling. Students will receive instructions and drawings of parts requiring 2- or 3-axis machining. Students will design, model, program, set-up and run their parts on various machines, including plasma cutters, water jet cutters and milling machines. WELD 197 Welding Technology Topics (.5 - 3)"
    
    match_re = "(^(.*)\d.* hours lecture)"
    match = re.search(match_re,string)
    if match:
        print(match.group(2))
    else:
        print("No match")
    

    【讨论】:

    • Regex 是我的第二个想法,我对此感到非常不舒服。由于结构更复杂,我很可能会在某个时候实现它。试试这个。我可以发布您想要浏览的整个文本文件吗?
    • @HYUTS:抱歉耽搁了时间。我自己不是正则表达式大师。但是是的,如果您发布整个文本文件(或更多文件以了解其结构),我或其他人可能会尝试更多。
    • 我不想让任何人花时间在上面。我很感激这个提议。我现在只需要一个开始,因为我知道我需要正则表达式,我可以尝试找出某种策略。
    猜你喜欢
    • 2023-03-25
    • 2013-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多