#python #python-3.x #parsing #extract
#python #python-3.x #Синтаксический анализ #извлечь
Вопрос:
Я пытаюсь извлечь определенные строки из текстового файла объемом 4,7 ГБ в другой текстовый файл.
Я довольно новичок в 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|||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 amp; 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)
Мне нужно извлечь полные строки, содержащие идентификатор C00501197, а затем заставить программу записать эти извлеченные строки в другой текстовый файл, но на данный момент извлекается только одна строка, и эта строка не начинается с идентификатора, который я хочу извлечь.
Комментарии:
1. Я бы настоятельно рекомендовал использовать
csv
модуль, например,csv.reader
с пользовательскимdelimiter
аргументом, для подобных вещей. Не запускайте свой собственный анализатор с регулярными выражениями, позвольте библиотекам выполнять работу за вас.2. Кроме того, для такого рода манипуляций вы могли бы попробовать заглянуть в команды оболочки? Я нахожу это весьма полезным, если это одноразовая вещь: например, для bash
cat data.txt | grep C00501197 > extracted_data.txt
Ответ №1:
Не используйте 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)
Ваш выходной код также был немного поврежден — всегда записывалась последняя строка в файле, а не выбранные записи.
Ответ №2:
Вы должны реализовать встроенный csv
модуль, который входит в стандартную комплектацию python. Он может легко преобразовать каждую строку в список. Попробуйте что-то вроде этого:
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)
Это должно вывести нужные строки. Затем вы можете делать все, что хотите, для их обработки и сохранять их снова.
Комментарии:
1. Это не очень полезный пример текста, поскольку он не содержит двоеточий, а ваше регулярное выражение явно ищет двоеточия.
2. @JohnGordon Я очень сбит с толку. Я даже не ввел регулярное выражение в свой код…
Ответ №3:
Вам не нужно проходить через регулярное выражение, просто разделите строку на основе разделителя и проверьте 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)))
Это должно сработать.
Комментарии:
1. Да, это должно сработать, но я не думаю, что вам следует включать
break
. OP указал, что «мне нужно извлечь полные строки» (множественное число строк).