Найти - Пользователи
Полная версия: поиск строки в файле
Начало » Python для новичков » поиск строки в файле
1 2
lexa24
Друзья, всем добра.

я во многом чайник, но хочется сделать одну штуку.
Есть файл rtf либо html. в этом файле кучка информации, в том числе в виде таблиц.
Хочется через питон по заранее известному тэгу найти строчку в этом файле и взять из нее число.
Сделать эту задачу с ТХТ-файлами получилось довольно легко.
А вот на RTF и HTML затормозил.
В чем здесь фишка? нужно ли использовать какие-то дополнительные библиотеки или модули? Можно ли обращаться к этим файлам так же, как и к ТХТ?
Мой код для ТХТ вот:
[
from __future__ import print_function
import io
noWord='Нет cовпадений'
word = u'рпы'
with io.open('L:/file.docx', encoding='cp1251') as file:
for line in file:
if word in line:
print(line, end='')
[int(s) for s in line.split() if s.isdigit()]
#int(aa)
print(s)
else:
print(noWord.decode('utf-8'))
input()]
doza_and
lexa24
А вот на RTF и HTML затормозил.
lexa24
with io.open('L:/file.docx', encoding='cp1251') as file:
Вы определитесь какой у вас формат файлов. rtf, doc, docx совершенно разные вещи.
lexa24
обращаться к этим файлам так же, как и к ТХТ?
Если коротко то нет.
Если у вас rtf - сочувствую, в ваших руках куча мусора.
html можно считать текстовым, а можно использовать lxml.
lexa24
В чем здесь фишка?
Фишка в том, что файлы rtf, doc, docx, html содержат в основном данные о красивом оформлении абзацев и цветах буковок, поэтому найти собственно данные непросто.
lexa24

doza_and
Да, там в коде docx - это я играть пытался с ним) Там должен быть ТХТ - исходник с него был снят
Таким образом, удобней всего обращаться к HTML? почитал несколько форумов - пишут больше про LXML все.
doza_and
Удобнее всего общаться со стандартными форматами например csv для таблиц. Ну или текстовым файлом.
(вы ведь для него написали уже обработчик :) ).
для docx есть довольно удобный https://python-docx.readthedocs.org/en/latest/. Наверное будет примерно одинаково сложно сохранить docx как текст и распарсить как вы уже делали, или вытащить данные при помощи python-docx.

p.s.
если вам нужны данные, причем в понятном для человека виде, и вы вольны сами выбирать формат, то лучше использовать форматы csv, json, yaml. Окончательный выбор зависит от структуры данных.
lexa24
doza_and
лучше использовать форматы csv, json, yaml. Окончательный выбор зависит от структуры данных.

Проблема в том, что файл, ы котором нужно искать информацию, создается только в двух форматах. и лезть ручками в него, чтоб пересохранить или перекодировать - это не есть правильно. Задача как раз и сводится именно к автоматическому чтению и выдергиванию строчки, в которой есть искомое число.

Конечно, у меня есть мысль извращенная (ну, поскольку я не совсем программист) - просто найти сроку, дернуть ее и запихать в ТХТ, а там ее уже тискать и мучить, как только захочется.
Просто мне казалось, что с RTF будет проще) А все пишут и говорят об HTML))
Ладно, буду пытаться разобраться с ХТМЛем) Спасибо за подсказку)
doza_and
html однозначно лучше чем rtf.
Маленький совет по технологии. Вообще html это текстовый файл. Вы можете посмотреть его внутреннее устройство при помощи текстового редактора (конечно не ворда ну чтото типа notepad++).

Если вытаскивать надо небольшие кусочки, то часто используют регулярные выражения см модуль re
lexa24
doza_and
html однозначно лучше чем rtf.Маленький совет по технологии. Вообще html это текстовый файл. Вы можете посмотреть его внутреннее устройство при помощи текстового редактора (конечно не ворда ну чтото типа notepad++).Если вытаскивать надо небольшие кусочки, то часто используют регулярные выражения см модуль re

Спасибо за советы и помощь, все вроде получается. Сделал немного колхозно, но действенно: копирую код ХТМЛ в ТХТ, а там задачка решена уже. Теперь дело за малым - вернуть адрес строки и спуститься на две строчки ниже) Насколько понял, это удобно делать через РегЭксп

мой код получился такой:
from __future__ import print_function
from bs4 import BeautifulSoup
from urllib2 import urlopen
import io
#ПЕРЕВОД ИЗ HTML В ТХТ
 
html_doc = urlopen('file:///L:/File.html').read()
soup = BeautifulSoup(html_doc)
 
#print html_doc
f=open(r"L:\File2.txt",'w')
f.write(str(soup))
f.close
#СФОРМИРОВАН ФАЙЛ File2.txt, СОДЕРЖАЩИЙ СТРУКТУРИРОВАННЫЙ КОД ДОКУМЕНТА HTML
#ПОИСК ЗНАЧЕНИЯ В ФАЙЛЕ ТХТ
#noWord='Нет cовпадений'
word = u'<td>Напряжение по Мизесу</td>'
with io.open('L:/File2.txt', encoding='utf-8') as file:
    for line in file:
        if word in line:
            print(line, end='')
            [int(s) for s in line.split() if s.isdigit()]
            #int(aa)
            print(s)
        #else:
           #print(noWord.decode('utf-8'))
input()
doza_and
lexa24
это удобно делать через РегЭксп
Неправильно поняли.
Все это :
f=open(r"L:\File2.txt",'w')
f.write(str(soup))
f.close()
word = u'<td>Напряжение по Мизесу</td>'
with io.open('L:/File2.txt', encoding='utf-8') as file:
    for line in file:
        if word in line:
            print(line, end='')
            [int(s) for s in line.split() if s.isdigit()]
с регулярными выражениями не нужно.
у close надо писать круглые скобки.
можно писать:
import re
print(re.findall("....",soup))
lexa24


doza_and
Все это :
f=open(r“L:\File2.txt”,'w')
f.write(str(soup))
f.close()
word = u'<td>Напряжение по Мизесу</td>'
with io.open('LFile2.txt', encoding='utf-8') as file:
for line in file:
if word in line:
print(line, end='')

с регулярными выражениями не нужно.


я это и не собирался через регулярные писать, я это хотел оставить вот в таком виде, как оно есть.

там, правда, сейчас есть несколько лишний строчек - это ерунда.
суть в том, что я нахожу тег, а после на две строчки ниже я беру числовое значение. Вот его-то я и хотел прочитать через re - если ничего не путаю, там можно получить номер строчки в файле. Дальше просто добавить к нему 2 и прочитать новую строчку

Не слишком колхозно?
lexa24
doza_and
Ну в целом вроде нашел способ.
сначала в цикле построчно ищу тег.
Потом выхожу, сохраняя номер строки с тегом.
Затем просто добавляю 2 - нужная мне строка всегда железно на две строчки ниже (костыль, но работает)

а после использую Linecache для нахождения строки по адресу.

#noWord='Нет cовпадений'
word = u'<td>Напряжение по Мизесу</td>'
with io.open('L:/File2.txt', encoding='utf-8') as file:
    for line in file:
        i=i+1
        if word in line:
            print(line, end='')
         
            break
        #else:
           #print(noWord.decode('utf-8'))
print(i)
i=i+2
napr=linecache.getline("L:\File2.txt",i)
print (napr)
input()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB