Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 27, 2015 15:24:43

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле

Друзья, всем добра.

я во многом чайник, но хочется сделать одну штуку.
Есть файл 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()]

Офлайн

#2 Дек. 27, 2015 15:39:43

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

поиск строки в файле

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 содержат в основном данные о красивом оформлении абзацев и цветах буковок, поэтому найти собственно данные непросто.



Отредактировано doza_and (Дек. 27, 2015 15:44:04)

Офлайн

#3 Дек. 27, 2015 19:38:00

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле


doza_and
Да, там в коде docx - это я играть пытался с ним) Там должен быть ТХТ - исходник с него был снят
Таким образом, удобней всего обращаться к HTML? почитал несколько форумов - пишут больше про LXML все.

Офлайн

#4 Дек. 27, 2015 19:58:36

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

поиск строки в файле

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

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



Отредактировано doza_and (Дек. 27, 2015 20:07:01)

Офлайн

#5 Дек. 27, 2015 21:36:04

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле

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

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

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

Офлайн

#6 Дек. 27, 2015 22:54:32

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

поиск строки в файле

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

Если вытаскивать надо небольшие кусочки, то часто используют регулярные выражения см модуль re



Офлайн

#7 Дек. 31, 2015 11:05:23

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле

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()

Отредактировано lexa24 (Дек. 31, 2015 11:05:56)

Офлайн

#8 Дек. 31, 2015 12:53:34

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

поиск строки в файле

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))



Офлайн

#9 Дек. 31, 2015 13:20:43

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле



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 и прочитать новую строчку

Не слишком колхозно?

Офлайн

#10 Дек. 31, 2015 14:52:20

lexa24
Зарегистрирован: 2015-06-10
Сообщения: 16
Репутация: +  0  -
Профиль   Отправить e-mail  

поиск строки в файле

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()

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version