Как я могу извлечь часть слов из файла, используя python3.6?
Я хочу извлечь конкретное слово из текстового файла.
Вот пример текстового файла:
https://drive.google.com/file/d/0BzQ6rtO2VN95d3NrTjktMExfNkU/view?usp=sharing
Пожалуйста, просмотрите это.
Я пытаюсь извлечь строку как:
"Name": "the name infront of it"
"Link": "Link infront of it"
Скажем из входного файла, я ожидаю получить вывод, как это:
"Name":"JTLnet"
"Link":"http://jtlnet.com"
"Name":"Apache 1.3"
"Link":"http://httpd.apache.org/docs/1.3"
"Name":"Apache"
"Link":"http://httpd.apache.org/"
.
.
.
"Name":"directNIC"
"Link":"http://directnic.com"
Если эти слова находятся где-либо в файле, он должен быть извлечен в другой файл.
Пожалуйста, дайте мне знать, как я могу достичь такого рода добычи? Пожалуйста, рассмотрите файл как маленькую часть большого файла.
Кроме того, это текстовый файл, а не JSON.
Пожалуйста, помогите мне.
3 ответа
Краткое решение с использованием re.findall()
а также str.split()
функции:
import re
with open('test.txt', 'r') as fh:
p = re.compile(r'(?:"Categories":[^,]+,)("Name":"[^"]+"),(?:[^,]+,)("Link":"[^"]+")')
result = [pair for l in re.findall(p, fh.read()) for pair in l]
print('\n'.join(result))
Вывод (фрагмент):
"Name":"JTLnet"
"Link":"http://jtlnet.com"
"Name":"Apache 1.3"
"Link":"http://httpd.apache.org/docs/1.3"
"Name":"Apache"
"Link":"http://httpd.apache.org/"
"Name":"PHP"
....
Поскольку текстовый файл не отформатирован должным образом, единственным вариантом для вас является регулярное выражение. Приведенный ниже фрагмент работает для данного файла примера.
Имейте в виду, что для этого необходимо загрузить весь файл в память
import re, json
f = open(r'filepath')
textCorpus = f.read()
f.close()
# replace empty strings to non-empty, match regex easily
textCorpus = textCorpus.replace('""', '" "')
lstMatches = re.findall(r'"Name".+?"Link":".+?"', textCorpus)
with open(r'new_file.txt', 'ab+) as wf:
for eachMatch in lstMatches:
convJson = "{" + eachMatch + "}"
json_data = json.loads(convJson)
wf.write(json_data["Name"] + "\n")
wf.write(json_data["Link"] + "\n")
Ваш файл - неправильно отформатированный json с лишними двойными кавычками. Но достаточно, чтобы модуль json не смог его загрузить. Вы остались с парсингом регулярных выражений более низкого уровня.
Предположения:
интересная часть после
"Name"
или же"Link"
является:- отделяется от идентификатора двоеточием (
:
) - в двойных кавычках (
"
) без двойных кавычек
- отделяется от идентификатора двоеточием (
- файл структурирован в строки
- Поля Name и Link всегда находятся в одной строке (в полях нет новой строки)
Вы можете обрабатывать ваш файл построчно с помощью простого re.finditer
на каждой строке:
rx = re.compile(r'(("Name":".*?")|("Link":".*?"))')
with open(inputfile) as fd:
for line in fd:
l = rx.finditer(line)
for elt in l:
print(elt.group(0))
Если вы хотите вывести данные в другой файл, просто откройте его перед фрагментом выше open(outputfile, "w") as fdout:
и замените строку печати:
fdout.write(elt.group(0) + "\n")