Уведомления

Группа в Telegram: @pythonsu

#1 Март 18, 2010 12:29:08

LinuxBoy
От:
Зарегистрирован: 2009-12-23
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

Есть файл, в нем текст. С “.*.” должен вывести весь файл, но получаю ошибку. Не пойму никак что за параметр string у finditer, в качестве string хочу использовать файл.

import string
import sys
import re

print "Content-type: text/html\n"

file = open("file.txt").readlines()
for match in re.finditer(".*.", file):
print match



Офлайн

#2 Март 18, 2010 12:43:25

UsCr
От:
Зарегистрирован: 2009-11-04
Сообщения: 216
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

file = open("file.txt", "r").readlines()
Нужно указывать режим, в котором открываете файл.



Офлайн

#3 Март 18, 2010 12:48:43

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

readlines() возвращает список строк, а не строку. Используйте метод read():

>>> import re
>>> f = open("file.txt").read()
>>> f
'String1\nString2\nString3\nString4'
>>> for match in re.finditer(".+", f): print "'%s'" % match.group(0)

'String1'
'String2'
'String3'
'String4'
LinuxBoy, я не понимаю зачем вам это нужно, но не проще сделать так:

>>> for line in open("file.txt"): print "'%s'" % line.rstrip()

'String1'
'String2'
'String3'
'String4'
UsCr
Нужно указывать режим, в котором открываете файл.
Режим “r” это значение по умолчанию…



Офлайн

#4 Март 18, 2010 12:50:57

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

re и finditer

LinuxBoy, вы когда считываете с помощью readlines() у вас в результате получается список строк. Если хотите весь файл в 1 строку - метод read(). В данном случае он и нужен.
UsCr, файл, при использовании метода open, если не указан режим, по умолчанию открывается для чтения, так что дело не в этом.



Офлайн

#5 Март 18, 2010 13:17:44

LinuxBoy
От:
Зарегистрирован: 2009-12-23
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

Спасибо! Вариант от Nik работает идельно, только вот возник еще вопросец. Как убрать символы '' из вывода в html?



Офлайн

#6 Март 18, 2010 13:20:23

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

print "'%s'" % line.rstrip()
заменить на
print line.rstrip()



Офлайн

#7 Март 18, 2010 14:18:58

LinuxBoy
От:
Зарегистрирован: 2009-12-23
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

На самом деле rstrip не при чем, просто надо не

"'%s'"
а
"%s"



Офлайн

#8 Март 19, 2010 10:59:43

LinuxBoy
От:
Зарегистрирован: 2009-12-23
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

Подскажите еще, мне нужно читать файл построчно, допустим 10 строк за раз снизу и в каждой строке проверять наличие определенных слов в соответствии с регексом и выводить только их. Понимаю что нужно использовать метод readline() в цикле, но что-то метод научного тыка приводит только к ошибкам…



Офлайн

#9 Март 19, 2010 13:07:33

Nik
От:
Зарегистрирован: 2010-01-10
Сообщения: 77
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

LinuxBoy
Понимаю что нужно использовать метод readline() в цикле
Достаточно в цикле указать функцию open()… С помощью метода next() (вызываемого неявно) файл будет читаться построчно.

"""
Содержимое файла file.txt:
String1
287
String2
782
"""
import re
p = re.compile(r"^[0-9]+$")
for line in open("file.txt"):
line = line.rstrip()
if p.search(line):
print line
LinuxBoy
но что-то метод научного тыка приводит только к ошибкам…
Может просто книжку почитать или в документации порыться?



Офлайн

#10 Март 19, 2010 13:29:41

LinuxBoy
От:
Зарегистрирован: 2009-12-23
Сообщения: 35
Репутация: +  0  -
Профиль   Отправить e-mail  

re и finditer

Читал, конкретных примеров нет. Туго идет.

p = re.compile(r".*sdso")
for line in reversed(open("file.txt").readline()):
line = line.rstrip()
if p.search(line):
print "%s<br>" % line
Хочу в обратном порядке, получаю:
TypeError: argument to reversed() must be a sequence\r,

Также мне интересен момент с readlines(), в качестве аргумента передаю 50, но читает все равно весь файл… Мне нужно нижних 10 строк прочитать, потому что лог растет и может быть до 100Mb…



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version