簡體   English   中英

蟒蛇。 如何從文件中獲取所需的行

[英]Python. How to get needed lines from file

我有一個這樣的文件(聊天文件,約5GB)

XX, XX[14:59]: 
hello YY.
how are you today? 
YY, YY [14:59]: 
Hi
good, thank you, and you~
XX, XX[15:00]: 
thanks, I am good) 
YY, YY [15:00]: 
;)

我寫了一些正則表達式,以便可以看到名稱更改。

def is_service_desk_line(line):
    return re.match("XX, XX \[[0-9]+:[0-9]+[ A-Z]*\]:", line)


def is_someone_else_line(line):
    return re.match("YY, YY *\[[0-9]+:[0-9]+[ A-Z]*\]:", line)

我不知道如何讀取文件以及如何設置“觸發器”(例如,一旦該行與服務台行匹配,就開始寫屬於用戶XX的下一行,直到該行與某人的其他行匹配為止。

我只需要屬於XX用戶的消息行。

我知道如何在Python中讀取文件,但是如何設置“觸發器”?

更新:

我需要的輸出只是屬於XX用戶的一行:

hello YY.
how are you toda?
thanks, I am good)

如果我對問題的理解正確,則可以使用以下方法:

f = open("input_file")
lines = f.readlines()
f.close()

for line in lines:
    if is_service_desk_line(line):
        print("This is a service desk line", line)
    elif is_someone_else_line(line):
        print("This is someone else", line)
    else:
        print("This is neither", line)

如果您只希望來自用戶XX的行,則只需使用if語句(否,否則,等等),它將僅輸出該用戶的行。

編輯

要僅輸出用戶XX的行,可以使用以下命令:

f = open("input.txt")
lines = f.readlines()
f.close()

print_line = False

for line in lines:
    if is_someone_else_line(line):
        print_line = False

    if print_line:
        print(line)

    if is_service_desk_line(line):
        print_line = True

輸出為:

hello YY.

how are you today? 

thanks, I am good) 

我做的!

編碼:

def get_messages(w_file, r_file):
    trigger = ""
    someone_else_line = ""
    with open(w_file, "wb") as w:
        with open(r_file, "r") as r:
            for line in r:
                if is_service_desk_line(line):
                    trigger = line
                    continue
                elif is_someone_else_line(line) or is_different_support(line):
                    trigger = line
                    someone_else_line = trigger
                    continue
                elif line.startswith("From"):
                    trigger = someone_else_line

                elif is_service_desk_line(trigger):
                    w.write(line)

封閉:)

您的文件很大,我不建議您使用readlines()將整個內容讀入內存

內存有效的版本將遵循以下原則:

out_flag = False

with open('input_file.txt', 'r') as in_file:
    for line in in_file:
        if is_service_desk_line(line):
            out_flag = True  # sets output flag
            continue  # skips that line
        if is_someone_else_line(line):
            out_flag = False  # sets output flag
        if out_flag:
            print(line)

匹配當前行之后,需要打印所有值,直到另一個用戶行為止。 因此,您需要為任何用戶添加一個正則表達式,以知道何時停止打印行並再次檢查某個用戶。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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