如何修复Python 3代码以从文本文件中提取特定行
我正在尝试将4.7GB文本文件中的特定行提取到另一个文本文件中 我对python 3.7.1非常陌生,这是我能想到的最好的代码 下面是文本文件的示例:如何修复Python 3代码以从文本文件中提取特定行,python,python-3.x,parsing,extract,Python,Python 3.x,Parsing,Extract,我正在尝试将4.7GB文本文件中的特定行提取到另一个文本文件中 我对python 3.7.1非常陌生,这是我能想到的最好的代码 下面是文本文件的示例: C00629618|N|TER|P|201701230300133512|15C|IND|DOE, JOHN A|PLEASANTVILLE|WA|00000|PRINCIPAL|DOUBLE NICKEL ADVISORS|01032017|40|H6CA34245|SA01251735122|1141239|||201252017136885
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
这是我写的代码:
重新导入
打开(“data.txt”,“r”)作为射频:
对于射频线路:
字段_match=re.match('^(.*):(.*)$',第行)
如果字段匹配:
(键)=字段\匹配组()
如果键==“C00501197”:
打印(记录拆分(“|”))
将open('extracted_data.txt','w')作为wf:
写入(行)
我需要提取包含id C00501197的完整行,然后让程序将这些提取的行写入另一个txt文件,但到目前为止,它只提取一行,而该行不以我要提取的id开头。您不需要通过正则表达式,只需根据分隔符拆分行,并检查您感兴趣的第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)
这将输出所需的行。然后,您可以执行任何您想要处理它们的操作,并再次保存它们 如果可以避免,就不要使用正则表达式
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)
您的输出代码也有点混乱-总是写出文件中的最后一行,而不是选定的记录 我强烈建议使用
csv
模块,例如带有自定义分隔符的csv.reader
参数,用于类似的内容。不要使用正则表达式来运行自己的解析器,让库为您完成工作。另外,对于这些类型的操作,您可以尝试查看shell命令吗?如果它是一次性的,我发现它非常有用:例如,对于bashcat data.txt | grep c0501197>extracted_data.txt
是的,应该可以,但我认为不应该包含中断
。OP指出“我需要提取整行”(复数行)。这不是一个非常有用的文本示例,因为它不包含任何冒号,并且您的正则表达式显式查找冒号。@JohnGordon我很困惑。我的代码中甚至没有正则表达式。。。