2013-05-17 3 views
0

Его не правильный код, но я хочу знать, есть ли способ поиска только одного слова w./o с использованием .split(), поскольку он формирует список и i не хочу, что с этим фрагментом:Python: прочитайте одно слово в строке текстового файла

f=(i for i in fin.xreadlines()) 
for i in f: 
    try: 
     match=re.search(r"([A-Z]+\b) | ([A-Z\'w]+\b) | (\b[A-Z]+\b) | (\b[A-Z\'w]+\b) | (.\w+\b)", i) # | r"[A-Z\'w]+\b" | r"\b[A-Z]+\b" | r"\b[A-Z\'w]+\b" | r".\w+\b" 

Также я могу сделать модуль многократного использования класса, как этот

class LineReader: #Intended only to be used with for loop 
    def __init__(self,filename): 
     self.fin=open(filename,'r') 
    def __getitem__(self,index): 
     line=self.fin.xreadline() 
     return line.split() 

где говорят F = LineReader (путь_к_файл)

и для г в ф. getitem (индекс = номер строки 25) начинается оттуда? Я не знаю, как это сделать. Советы?

+0

Что вам нужно вместо списка? Генератор? Функция, возвращающая новое слово при каждом вызове? – Lennart

+0

вывод должен быть, например, в строке: word1 word2 word3 .. только строка o/p – user2290820

+0

@ Lennart позволяет сказать, что для простого текстового файла выполняется поиск определенного шаблона. Только печать 1 o/p на строку. и может ли это быть сделано через класс, как указано выше? – user2290820

ответ

1

Чтобы получить первое слово строки:

line[:max(line.find(' '), 0) or None] 

line.find(' ') поиски первого пробела, и возвращает его. Если нет пробела, он возвращает -1

max(...), 0) гарантирует, что результат всегда больше 0 и составляет -1 0. Это полезно, поскольку bool (-1) имеет значение True, а bool (0) - False.

x or None имеет значение х, если х = 0 еще Ни

и, наконец line[:None] равно line[:], который возвращает строку, идентичную line

Первый образец:

with open('file') as f: 
    for line in f: 
     word = line[:max(line.find(' '), 0) or None] 
     if condition(word): 
      do_something(word) 

а также класса (используется в качестве генератора здесь)

def words(stream): 
    for line in stream: 
     yield line[:max(line.find(' '), 0) or None] 

Что вы могли бы использовать как

gen = words(f) 
for word in gen: 
    if condition(word): 
     print word 

Или

gen = words(f) 
while 1: 
    try: 
     word = gen.next() 
     if condition(word): 
      print word 
    except StopIteration: 
     break # we reached the end 

Но вы также хотели, чтобы начать чтение с определенной LINENUMBER. Это невозможно сделать очень эффективно, если вы не знаете длины строк. Единственный способ - чтение строк и отбрасывание их до тех пор, пока вы не достигнете правого полотна.

def words(stream, start=-1): # you could replace the -1 with 0 and remove the +1 
    for i in range(start+1): # it depend on whether you start counting with 0 or 1 
     try: 
      stream.next() 
     except StopIteration: 
      break 
    for line in stream: 
     yield line[:max(line.find(' '), 0) or None] 

Следует иметь в виду, что вы можете получить странные результаты, если линия начнется с пробела. Чтобы этого не произошло, вы можете вставить line = line.rstrip() в начале цикла.

Отказ от ответственности: Ни один из этого кода не протестирован

Смежные вопросы