Трудно обеспечить надежное решение, не понимая фактический формат входных данных, допустимую гибкость и то, как будут использоваться проанализированные данные.
Из приведенного выше примера ввода / вывода можно быстро создать рабочий пример кода:
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")
В обоих приведенных выше примерах предполагается, что «идентификатор пользователя X» всегда стоит перед «N именем пользователя X», следовательно, соответствующие завершающие символы «,» и «\ n».
Если порядок не является конкретным, можно сохранить значения в словаре, используя числовой идентификатор в качестве ключа, а затем распечатать пару идентификатор / имя после того, как все входные данные были проанализированы.
Если вы предоставите больше информации, возможно, мы сможем вам помочь.