我有一个文件,其中包含我想要提取的特定数据。
该文件如下所示:
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
到目前为止,我有:
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)
我的屏幕输出如下:
DS user ID 1
DS N user name 1
DS user ID 2
DS N user name 2
如果我使用以下方式写入文件:
outfile = "test.dat"
FILE = open(outfile,"a")
FILE.writelines(line)
FILE.close()
一切都被推到了一条线上:
DS user ID 1DS N user name 1DS user ID 2DS N user name 2
我可以忍受输出的第一个场景。理想情况下,我想从输出文件中删除“DS”和“DS N”并将其逗号分开。
User ID 1,user name 1
User ID 2, username 2
关于如何实现这一目标的任何想法?
答案 0 :(得分: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")
输出文件将是:
User ID 1,user name 1
User ID 2,user name 2
如果已知格式规范,则使用正则表达式可以使该代码更加健壮。例如:
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")
上述两个例子都假设“用户ID X”始终位于“N用户名X”之前,因此各个尾随字符为“,”和“\ n”。
如果订单不具体,可以使用数字ID作为键将值存储在字典中,然后在解析完所有输入后打印出ID /名称对。
如果您提供更多信息,或许我们可以提供更多帮助。
答案 1 :(得分:4)
print
在参数后添加换行符,但writelines
没有。所以你必须这样写:
file = open(outfile, "a")
file.writelines((i + '\n' for i in findPat1))
file.close()
writelines
语句也可以写成:
for i in findPat1:
file.write(i + '\n')
答案 2 :(得分:1)
FILE.writelines(line)
不添加行分隔符。
只是做:
FILE.write(line + "\n")
或者:
FILE.write("\n".join(lines))
答案 3 :(得分:0)
import re
ch ='''\
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'''
RE = '^DS (User ID (\d+)).+?^DS N( user name \\2)'
with open('outputfile.txt','w') as f:
for match in re.finditer(RE,ch,re.MULTILINE|re.DOTALL):
f.write(','.join(match.groups())+'\n')
编辑:
替换
RE = '^DS (User ID \d+).+?^DS N( user name \d+)'
与
RE = '^DS (User ID (\d+)).+?^DS N( user name \\2)'