Уведомления

Группа в Telegram: @pythonsu

#1 Март 5, 2009 16:38:53

igor.kaist
От:
Зарегистрирован: 2007-11-12
Сообщения: 1879
Репутация: +  3  -
Профиль   Отправить e-mail  

Раобта со строками

ZAN
Все круче - Новичек пытается запустить питон из питоновского же шелла, хотя нужно из коммандной строки.
Недоглядел :)
Ну тогда можно поругать за то, что в эту тему задал вопрос :)



Офлайн

#2 Март 9, 2009 10:43:52

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

Раобта со строками

мда далековато мне еше до совершенства :)))

спасибо

Андрей Светлов
s = ‘'’
BONGO
BONG
NAME text2
TYPE tozeText2
FILTER kakojnitTip2
END
fds
fs
df
sdf
sdf
sd
f
sdf
s
dfsdfsd
BONGO
BONG
NAME tedsdsxt2
TYPE tozeText2
FILTER kakojnitTip2
END
'''
хотел бы спросить в Вашем примере переменная s(?) уже с текстом, а как сделать если я хочу хичитать из файла?

s = open('./file.f', ‘r’).xreadlines ili s = open('./file.f', ‘r’).readlines()

выдают

Traceback (most recent call last):
File "./file1.f", line 51, in <module>
for line in s.split('\n'):
AttributeError: 'list' object has no attribute 'split'
понятно что такого обьекта нет, но вот как его создать ?

а если оставить read() (это как я понимая чтение одной строки) то вывода никакого нет :/



Отредактировано (Март 9, 2009 10:50:12)

Офлайн

#3 Март 9, 2009 11:02:35

alexzander77
От:
Зарегистрирован: 2009-01-27
Сообщения: 46
Репутация: +  1  -
Профиль   Отправить e-mail  

Раобта со строками

gelo
s = open('./file.f', ‘r’).xreadlines ili s = open('./file.f', ‘r’).readlines()

выдают

Traceback (most recent call last):
File "./file1.f", line 51, in <module>
for line in s.split('\n'):
AttributeError: 'list' object has no attribute 'split'
понятно что такого обьекта нет, но вот как его создать ?

а если оставить read() (это как я понимая чтение одной строки) то вывода никакого нет :/
просто
for line in s:



Офлайн

#4 Март 9, 2009 11:20:57

Griffon
От: Ukrain, Zaporozhie
Зарегистрирован: 2009-03-04
Сообщения: 324
Репутация: +  11  -
Профиль   Отправить e-mail  

Раобта со строками

readlines возвращает не строку, а список каждый элемент которого это новая строка.
Каждая строка почему то заканчивается “\n”. Хотя как по мне так разумно было бы исключать автоматически это дело.

Таким образом for line in open(filename).readlines(): dosomewith(line)
Так делаю я.
А как правильно расскажут более опытные товарищи.



Офлайн

#5 Март 9, 2009 12:38:55

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Раобта со строками

Я делаю так:

fh = open(filename)
for line in fh:
dosomething(line)
fh.close()
В отличие от варианта с readlines здесь нет чтения всего файла в некий список. open возвращает итератор по строкам.

В тех версиях python, где есть конструкция with, можно написать это вот так:
with open(filename) as fh:
for line in fh:
dosomething(line)



Отредактировано (Март 9, 2009 14:04:09)

Офлайн

#6 Март 9, 2009 16:19:58

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Раобта со строками

gelo, все делать примерно как Ed предлагает.

p = parser()
p.send(None)
for line in open(filename):
ret = p.send(line)
if ret:
print ret



Офлайн

#7 Март 10, 2009 09:12:23

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Раобта со строками

for line in open(filename):
Я как-то привык файлы за собой закрывать. Дурная привычка?
PS: Я в курсе того, что в Python есть gc, который сделает эту работу, но предпочитаю быть explicit в таких случаях.



Офлайн

#8 Март 10, 2009 11:54:34

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Раобта со строками

Ed Это не gc, а decref сразу же после окончания for loop. А файл открыт на чтение. Был бы на запись - я бы его тоже прикрыл. Для уверенности :)
Или если бы лежал в какой-то переменной - чтобы ограничить scope.
А так все очень просто - ты по нему пробежался, и от пропал. Совсем. Даже и закрывать нечего.



Офлайн

#9 Март 11, 2009 18:47:51

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

Раобта со строками

Андрей Светлов
voobsem to uz koesto smasteril s predlozenym reseniem, tolko vot pojavilas strannyj nadpisi :D

Traceback (most recent call last):
File "./e3.py", line 37, in <module>
if re.search('#[ ]*?DATA|#[ ]*?TILEINDEX', ret):
File "/usr/lib/python2.5/re.py", line 142, in search
return _compile(pattern, flags).search(string)
TypeError: expected string or buffer
i

Traceback (most recent call last):
File "./e3.py", line 35, in <module>
ret = p.send(line)
File "./e3.py", line 22, in parser
const, text = line.split()
ValueError: too many values to unpack
osobenno pervuju nemogu razobrat. mozet nado re.compile() a potom filtrirovat ? ja vse dumaju sto re.compile tol'ko dlja uskorenija raboty interpretaqtora.

ps. prosu izvenit za lat. bukvy. nikak ne mogu v Elive vstavit russkuju foneticeskuju klaviatruru :)



Офлайн

#10 Март 11, 2009 19:36:33

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Раобта со строками

Вторая проблема.
Проверка идет на строки типа ‘FIELD_TYPE FIELD VALUE’
Если формат другой - ломается.
Чинить легко
Вместо

                if line.startswith('NAME'):
const, text = line.split()
name = text
нужно что-то вроде
                if line.startswith('NAME'):
lst = line.split()
lst.pop(0) #drop type field
name = lst.pop(0) # second word is out target
Что касается первой -
из итератора возвращается структура
(str_name, list_of_strings_with_content_of_found_block)
Мне для примера показалось удобным. А ты, вероятно, все это хочешь скормить в re.search(…). Он со списками работать не умеет, ему строку подавай.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version