[英]Create Output file with multiple lines (Python)
我有一個文件,其中包含我想要提取的特定數據。
該文件如下所示:
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
關於如何實現這一目標的任何想法?
在不了解實際輸入數據格式,允許多大的靈活性以及如何使用解析數據的情況下,很難提供可靠的解決方案。
從上面給出的示例輸入/輸出,可以快速制作一個工作示例代碼:
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 /名稱對。
如果您提供更多信息,也許我們可以提供更多幫助。
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')
FILE.writelines(line)
不添加行分隔符。
做就是了:
FILE.write(line + "\n")
要么:
FILE.write("\n".join(lines))
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)'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.