如何修复python3代码以从文本中提取特定行

2024-10-06 12:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图从一个4.7gb的文本文件中提取特定的行到另一个文本文件中。你知道吗

我对python3.7.1还很陌生,这是我能想到的最好的代码。你知道吗

以下是文本文件的示例:

C00629618|N|TER|P|201701230300133512|15C|IND|DOE, JOHN A|PLEASANTVILLE|WA|00000|PRINCIPAL|DOUBLE NICKEL ADVISORS|01032017|40|H6CA34245|SA01251735122|1141239|||2012520171368850783
C00501197|N|M2|P|201702039042410893|15|IND|DOE, JANE|THE LODGE|GA|00000|UNUM|SVP, CORPORATE COMMUNICATIONS|01312017|230||PR1890575345050|1147350||P/R DEDUCTION ($115.00 BI-WEEKLY)|4020820171370029335
C00177436|N|M2|P|201702039042410893|15|IND|DOE, JOHN|RED ROOM|ME|00000|UNUM|SVP, DEPUTY GENERAL COUNSEL, BUSINESS|01312017|384||PR2260663445050|1147350||P/R DEDUCTION ($192.00 BI-WEEKLY)|4020820171370029336
C00177436|N|M2|P|201702039042410895|15|IND|PALMER, LAURA|TWIN PEAKS|WA|00000|UNUM|EVP, GLOBAL SERVICES|01312017|384||PR2283905245050|1147350||P/R DEDUCTION ($192.00 BI-WEEKLY)|4020820171370029342
C00501197|N|M2|P|201702039042410894|15|IND|COOPER, DALE|TWIN PEAKS|WA|00000|UNUM|SVP, CORP MKTG & PUBLIC RELAT.|01312017|384||PR2283904845050|1147350||P/R DEDUCTION ($192.00 BI-WEEKLY)|4020820171370029339

这是我写的代码:

import re

with open("data.txt", 'r') as rf:
    for line in rf:
        field_match = re.match('^(.*):(.*)$',line)

        if field_match :
            (key) = field_match.groups()
            if key == "C00501197" :
                print(rec.split('|'))

with open('extracted_data.txt','w') as wf:
    wf.write(line)

我需要提取包含id C00501197的完整行,然后让程序将这些提取的行写入另一个txt文件,但到目前为止,它只提取一行,而该行并不是以我要提取的id开头。你知道吗


Tags: txtfieldmatchline文本文件biinddoe
3条回答

如果可以避免,就不要使用regex。csv是一个很好的选择,或者使用简单的字符串操作。你知道吗

ans = []

with open('data.txt') as rf:
    for line in rf:
        line = line.strip()
        if line.startswith("C00501197"):
            ans.append(line)

with open('extracted_data.txt', 'w') as wf:
    for line in ans:
        wf.write(line)

您的输出代码也有点崩溃-总是写出文件中的最后一行,而不是选定的记录。你知道吗

您不需要通过regex,只需根据分隔符拆分行并检查您感兴趣的第n个字段:

found_lines = []

with open("data.txt", 'r') as rf:
    for line_file in rf:
        line = line_file.split("|")
        if line[0] == "C00501197" :
            found_lines.append( line )

with open('extracted_data.txt','w') as wf:
    for found_line in found_lines :
        wf.write("|".join(map(str,found_line)))

这应该管用。你知道吗

您应该实现python标准的内置csv模块。它可以很容易地将每一行解析为一个列表。尝试以下操作:

import csv

with open('text.txt', 'r') as file:
    my_reader = csv.reader(file, delimiter='|')
    for row in my_reader:
        if row[0] == 'C00501197':
            print(row)

这应该输出您想要的行。然后,您可以执行任何您想处理它们的操作,并再次保存它们。你知道吗

相关问题 更多 >