使用多行创建输出文件(Python)

use*_*302 5 python text

我有一个文件,其中包含我想要提取的特定数据.

该文件如下所示:

DS User ID 1  
random garbage  
random garbage  
DS  N user name 1   
random garbage  
DS User ID 2   
random garbage  
random garbage  
DS  N user name 2
Run Code Online (Sandbox Code Playgroud)

到目前为止,我有:

import sys  
import re  
f = open(sys.argv[1])

strToSearch = ""

for line in f:
        strToSearch += line

patFinder1 = re.compile('DS\s+\d{4}|DS\s{2}\w\s{2}\w.*|DS\s{2}N', re.MULTILINE)

for i in findPat1:  
    print(i)
Run Code Online (Sandbox Code Playgroud)

我输出到屏幕看起来像这样:

DS user ID 1  
DS  N user name 1  
DS user ID 2  
DS  N user name 2   
Run Code Online (Sandbox Code Playgroud)

如果我使用以下方式写入文件:

outfile = "test.dat"   
FILE = open(outfile,"a")  
FILE.writelines(line)  
FILE.close()  
Run Code Online (Sandbox Code Playgroud)

一切都被推到了一条线上:

DS user ID 1DS  N user name 1DS user ID 2DS  N user name 2 
Run Code Online (Sandbox Code Playgroud)

我可以忍受输出的第一个场景.理想情况下,虽然我想从输出文件中删除"DS"和"DS N"并将其逗号分隔.

User ID 1,user name 1  
User ID 2, username 2
Run Code Online (Sandbox Code Playgroud)

关于如何实现这一目标的任何想法?

Sha*_*hin 5

在不了解实际输入数据格式,允许多大的灵活性以及如何使用解析数据的情况下,很难提供可靠的解决方案.

从上面给出的示例输入/输出,可以快速制作一个工作示例代码:

out = open("test.dat", "a") # output file

for line in open("input.dat"):
    if line[:3] != "DS ": continue # skip "random garbage"

    keys = line.split()[1:] # split, remove "DS"
    if keys[0] != "N": # found ID, print with comma
        out.write(" ".join(keys) + ",")
    else: # found name, print and end line
        out.write(" ".join(keys[1:]) + "\n")
Run Code Online (Sandbox Code Playgroud)

输出文件将是:

User ID 1,user name 1
User ID 2,user name 2
Run Code Online (Sandbox Code Playgroud)

如果已知格式规范,则使用正则表达式可以使该代码更加健壮.例如:

import re
pat_id = re.compile(r"DS\s+(User ID\s+\d+)")
pat_name = re.compile(r"DS\s+N\s+(.+\s+\d+)")
out = open("test.dat", "a")

for line in open("input.dat"):
    match = pat_id.match(line)
    if match: # found ID, print with comma
        out.write(match.group(1) + ",")
        continue
    match = pat_name.match(line)
    if match: # found name, print and end line
        out.write(match.group(1) + "\n")
Run Code Online (Sandbox Code Playgroud)

上述两个例子都假定"用户ID X"总是在"N用户名X"之前,因此相应的尾随字符","和"\n".

如果订单不是特定的,可以使用数字ID作为键将值存储在字典中,然后在解析完所有输入后打印出ID /名称对.

如果您提供更多信息,也许我们可以提供更多帮助.