2013-12-06 2 views
0

Я использую Python3, чтобы попытаться подражатьПечать строки, содержащие строки: Странное поведение

awk '/STRING/' 

Я сделал некоторый код, который работает, но он останавливается на первом случае вместо того, чтобы найти все строки, содержащие указанный символ/строка.

После того как я сделал код, я видел эти две страницы, но предложения не работают

Print line containing "word" python

Search and get a line in Python

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
#Made by Devyn Collier Johnson, NCLA, Linux+, LPIC-1, DCTS 
def cat(openfile): #Emulates cat# 
    with open(openfile) as file: 
     lines = file.readlines() 
     return ''.join(lines) 
def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
     if CONTAINING in item: 
      return item.strip() 

print(GETLINEWITH(cat('./Base.xaiml'), 'terminal')) 

У меня есть файл (./Base.xaiml) который содержит несколько экземпляров слова «терминал». Я использую этот файл и строку для тестирования.

EDIT: Я также хочу, чтобы сохранить результаты в переменной -

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
#Made by Devyn Collier Johnson, NCLA, Linux+, LPIC-1, DCTS 
def cat(openfile): #Emulates cat# 
    with open(openfile) as file: 
     lines = file.readlines() 
     return ''.join(lines) 
def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
     if CONTAINING in item: 
      print(item.strip()) #I implemented the give suggestion 

VAR = GETLINEWITH(cat('./Base.xaiml'), 'terminal')) 

Результаты:

я пытался Джон Клементс предложение:

with open('./Base.xaiml') as fin: 
    matching = ('terminal' in line for line in fin) 
    for line in matching: 
     VAR = matching 
print(VAR) 

Однако, выход - один адрес памяти. '.join() и group() не помогают.

Edit2:

Новейшие код вопросов - nonetype ошибка и выход не может быть сохранен в переменный

#!/usr/bin/env python3 
# -*- coding: utf-8 -*- 
#Made by Devyn Collier Johnson, NCLA, Linux+, LPIC-1, DCTS 
def cat(openfile): #Emulates cat# 
    with open(openfile) as file: 
     lines = file.readlines() 
     return ''.join(lines) 
def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
     if CONTAINING in item: 
      print(item.strip()) 
for line in GETLINEWITH(cat('./Base.xaiml'), 'terminal'): 
    print(line) 
+1

'cat' делает больше, чем прочитать файл. Речь идет о линиях con * cat *. – wim

+2

Ответы, на которые вы ссылались, имеют рабочие решения - почему вы не просто используете один из тех, кто решит это? –

+0

Ответы в этом вопросе работают, если вы измените 'print x' на' print (x) '. Ваша сложная логика «read-split-paste-split-search» не нужна. –

ответ

3

Здесь вы идете, обратите внимание, что Я просто собираю все комментарии elses явно для вас.

#!/usr/bin/env python3 

def cat(openfile): 
    with open(openfile) as file: 
    return file.read() 

def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
    if CONTAINING in item: 
     yield item.strip() 

matchedlines = [] 

for line in GETLINEWITH(cat('./Base.xaiml'), 'terminal'): 
    print(line) 
    matchedlines.append(line) 

print(matchedlines) 

matchedlines переменная является лишь примером для вас одного способа, чтобы сохранить совпавшие строки в переменной.

Альтернатива GETLINEWITH реализации:

import re 

def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
    m = re.search(CONTAINING, item) 
    if m: 
     yield m.string 

Который позволит вам соответствовать по регулярным выражениям.

+0

Спасибо. Мне нравится, как вы собрали все это для меня. –

1

Во всяком случае - по причине его «останавливается», потому что вы возвращаетесь после того, как матч ....

def GETLINEWITH(FILECONTENTS, CONTAINING): 
    for item in FILECONTENTS.split('\n'): 
     if CONTAINING in item: 
      return item.strip() # <---- returns as soon as something's found 

Изменить его в yield, чтобы сделать функцию генератора й затем цикл над ним:

for line in GETLINEWITH(cat('./Base.xaiml'), 'terminal'): 
    print(line) 

В конечном счете, ваша функция должна быть просто:

with open('thefile') as fin: 
    matching = (line for line in fin if 'something' in line) 
    for line in matching: 
     # do something 

Или поместить их всех в список:

lines = list(matching) 
+0

Спасибо, но как бы сохранить это в переменной? Если я изменю код, чтобы сохранить его как переменную, результаты будут напечатаны на экране. –

+0

@DevynCollierJohnson сделал пару исправлений ... это ответ на ваш вопрос? –

+0

Джон, я пробовал твою идею. См. Мои изменения для результатов. Закрыть, но не совсем. Спасибо за ваши старания. –

1

Файловые объекты итерабельны, и для фильтрации входных данных можно использовать представление списка.

with open('./Base.xaiml','r') as lines: 
    matching_lines = [ line.rstrip('\n') 
         for line in lines 
         if line.find('terminal') != -1 ] 

for line in matching_lines: 
    print line   # change to print(line) for python 3.x 

EDIT: или, если вы действительно хотите, чтобы функция

def matching_lines(filename, substring): 
    """ Return all the lines in a file that contain a given substring. """ 
    with open(filename,'r') as f: 
     return [s.rstrip('\n') for s in f if s.find(substring) != -1] 

for s in matching_lines('./Base.xaiml', 'terminal'): 
    print s 
Смежные вопросы