Найти - Пользователи
Полная версия: Раобта со строками
Начало » Python для новичков » Раобта со строками
1 2 3 4
igor.kaist
ZAN
Все круче - Новичек пытается запустить питон из питоновского же шелла, хотя нужно из коммандной строки.
Недоглядел :)
Ну тогда можно поругать за то, что в эту тему задал вопрос :)
gelo
мда далековато мне еше до совершенства :)))

спасибо

Андрей Светлов
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() (это как я понимая чтение одной строки) то вывода никакого нет :/
alexzander77
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:
Griffon
readlines возвращает не строку, а список каждый элемент которого это новая строка.
Каждая строка почему то заканчивается “\n”. Хотя как по мне так разумно было бы исключать автоматически это дело.

Таким образом for line in open(filename).readlines(): dosomewith(line)
Так делаю я.
А как правильно расскажут более опытные товарищи.
Ed
Я делаю так:
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)
Андрей Светлов
gelo, все делать примерно как Ed предлагает.
p = parser()
p.send(None)
for line in open(filename):
ret = p.send(line)
if ret:
print ret
Ed
for line in open(filename):
Я как-то привык файлы за собой закрывать. Дурная привычка?
PS: Я в курсе того, что в Python есть gc, который сделает эту работу, но предпочитаю быть explicit в таких случаях.
Андрей Светлов
Ed Это не gc, а decref сразу же после окончания for loop. А файл открыт на чтение. Был бы на запись - я бы его тоже прикрыл. Для уверенности :)
Или если бы лежал в какой-то переменной - чтобы ограничить scope.
А так все очень просто - ты по нему пробежался, и от пропал. Совсем. Даже и закрывать нечего.
gelo
Андрей Светлов
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 :)
Андрей Светлов
Вторая проблема.
Проверка идет на строки типа ‘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(…). Он со списками работать не умеет, ему строку подавай.
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