簡體   English   中英

使用多行創建輸出文件(Python)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM