Первая часть в порядке, где вы получаете общее количество слов и распечатываете результат.
Здесь вы упали здесь
words_par = 0
for words_par in lines:
if words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3"):
words_par = line.split()
print len(words_par)
print words_par.replace('P1', '') #doesn't display it but still counts
else:
print 'No words'
words_par находится всначала строка, содержащая строку из файла.При условии, которое никогда не будет выполнено, оно превращается в список с выражением
line.split()
.Это, если выражение
words_par.startswith("P1" or "P2" or "P3") & words_par.endswith("P1" or "P2" or "P3")
когда-либо будет возвращать True, всегда будет разбивать последнюю строку в вашем файле, потому что последний раз, когда он был назначен, был в первой части вашей программы, где высделал полный подсчет количества слов в файле.Это действительно должно быть
words_par.split()
Также
words_par.startswith("P1" or "P2" or "P3")
всегда будет
words_par.startswith("P1")
, поскольку
"P1" or "P2" or "P3"
всегда оценивается как первоетот, который является True, который является первой строкой в этом случае.Прочитайте http://docs.python.org/reference/expressions.html, если вы хотите узнать больше.
Пока мы занимаемся этим, если вы не хотите делать побитовые сравнения, избегайте делать
something & something
вместо этого
something and something
Первое будет оценивать оба выражения независимо от результата первого, тогда как второе будет оценивать второе выражение только в том случае, если первое имеет значение True.Если вы сделаете это, ваш код будет работать немного эффективнее.
print len(words_par)
на следующей строке всегда будет подсчитывать количество символов в строке, так как оператор ifвсегда будет иметь значение False, а word_par никогда не будет разбит на список слов.
Кроме того, условие else в цикле for всегда будет выполняться независимо от того, пуста последовательность или нет.Взгляните на http://docs.python.org/reference/compound_stmts.html#the-for-statement для получения дополнительной информации.
Я написал версию того, о чем вы думаете, в качестве примера, согласно тому, что я думаю, что вы хотите.Я старался быть простым и избегать использования таких вещей, как понимание списков, поскольку вы говорите, что только начинаете учиться, поэтому это не оптимально, но, надеюсь, будет понятно.Также обратите внимание, что я не комментировал, поэтому не стесняйтесь объяснять мне, что вам нужно.
words = None
with open('data.txt') as f:
words = f.read().split()
total_words = len(words)
print 'Total words:', total_words
in_para = False
para_count = 0
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', para_count
print ' '.join(paragraph)
para_count = 0
del paragraph[:]
para_type = word
else:
paragraph.append(word)
para_count += 1
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', para_count
print ' '.join(paragraph)
else:
print 'No words'
РЕДАКТИРОВАТЬ:
Я на самом деле только что заметил некоторый избыточный код в примере.Переменная para_count не нужна, поскольку слова добавляются в переменную абзаца.Поэтому вместо
print 'Words in paragraph', para_type, ':', para_count
Вы можете просто сделать
print 'Words in paragraph', para_type, ':', len(paragraph)
На одну переменную меньше, чтобы отслеживать.Вот исправленный фрагмент.
in_para = False
para_type = None
paragraph = list()
for word in words:
if ('P1' in word or
'P2' in word or
'P3' in word ):
if in_para == False:
in_para = True
para_type = word
else:
print 'Words in paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
del paragraph[:]
para_type = word
else:
paragraph.append(word)
else:
if in_para == True:
print 'Words in last paragraph', para_type, ':', len(paragraph)
print ' '.join(paragraph)
else:
print 'No words'