Як шукати рядок у текстових файлах?


169

Я хочу перевірити, чи є рядок у текстовому файлі. Якщо це так, зробіть X. Якщо це не так, зробіть Y. Однак цей код завжди повертається Trueз якоїсь причини. Хтось може бачити, що не так?

def check():
    datafile = file('example.txt')
    found = False
    for line in datafile:
        if blabla in line:
            found = True
            break

check()
if True:
    print "true"
else:
    print "false"

Відповіді:


391

Причину, чому ви завжди отримуєте True, вже вказано, тому я просто запропоную ще одну пропозицію:

Якщо ваш файл не надто великий, ви можете прочитати його в рядок і просто використовувати це (простіше і часто швидше, ніж читання та перевірка рядка на рядок):

with open('example.txt') as f:
    if 'blabla' in f.read():
        print("true")

Ще одна хитрість: ви можете полегшити можливі проблеми з пам’яттю, mmap.mmap()створивши об’єкт «рядовий», який використовує базовий файл (замість того, щоб читати весь файл у пам'яті):

import mmap

with open('example.txt') as f:
    s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
    if s.find('blabla') != -1:
        print('true')

ПРИМІТКА: у python 3, mmaps поводяться як bytearrayоб'єкти, а не рядки, тому послідовність, яку ви шукаєте, find()має бути bytesоб'єктом, а не рядком, наприклад. s.find(b'blabla'):

#!/usr/bin/env python3
import mmap

with open('example.txt', 'rb', 0) as file, \
     mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as s:
    if s.find(b'blabla') != -1:
        print('true')

Ви також можете використовувати регулярні вирази для, mmapнаприклад, нечутливого до регістру пошуку:if re.search(br'(?i)blabla', s):


84
Це геніально! Саме тому я люблю stackoverflow: це не просто дає вам рішення, а дає вам кращий варіант. Дякую :)
HankSmackHood

1
Друге рішення не дає таких же результатів, як 'blabla' in open('example.txt').read()у мого пітона 2.7
xApple

1
Як не дивно, це спрацьовує s.find('blabla')(перевірити на -1). Я міг би поклястись, що раніше працював з ним in... Але, здається, зараз це inпрацює лише для одиноких персонажів ...
Стівен

6
if 'blabla' in open('example.txt').read(): print "true"==> Як ми можемо закрити example.txtфайл у цьому випадку?

4
openяк правило, слід зафіксувати в withзаяві:with open(file_name) as fl: return text in fl.read()
Охад Шнайдер

27

Як Джеффрі Саїд, ви не перевіряєте значення check(). Крім того, ваша check()функція нічого не повертає. Зверніть увагу на різницю:

def check():
    with open('example.txt') as f:
        datafile = f.readlines()
    found = False  # This isn't really necessary
    for line in datafile:
        if blabla in line:
            # found = True # Not necessary
            return True
    return False  # Because you finished the search without finding

Тоді ви можете перевірити вихід check():

if check():
    print('True')
else:
    print('False')

22

Ось ще один спосіб, можливо, відповісти на ваше запитання за допомогою функції пошуку, яка дає вам буквальне числове значення того, де щось справді є

open('file', 'r').read().find('')

У пошуку напишіть слово, яке ви хочете знайти, і 'file'стоїть на вашому імені файлу


11
if True:
    print "true"

Це завжди відбувається, тому що True завжди є правдою.

Ви хочете щось подібне:

if check():
    print "true"
else:
    print "false"

Удачі!


Я бачу, це працює і зараз. Мені це здається трохи дивним, це означає, що Python каже, що "модуль - True, якщо не вказано інше". Тож якби я зробив порожній модуль, це завжди було б правдою? Цікаво :)
HankSmackHood

11
Ні, зовсім не - нічого спільного з модулями. Ви просто перевіряли, чи правда правда, що це таке.
Даніель Роузман

5

Я зробив для цього невелику функцію. Він шукає слово у вхідному файлі, а потім додає його у вихідний файл.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf - вихідний файл
  • inf - вхідний файл
  • рядок - це, звичайно, потрібна рядок, яку ви хочете знайти та додати до outf.

4

Ваша checkфункція повинна повернути foundбулевий і використовувати його для визначення того, що слід надрукувати.

def check():
        datafile = file('example.txt')
        found = False
        for line in datafile:
            if blabla in line:
                found = True
                break

        return found

found = check()
if found:
    print "true"
else:
    print "false"

другий блок також може бути конденсований для:

if check():
    print "true"
else:
    print "false"

1
Усі вищезазначені відповіді різко помилкові, крім ваших. Я витратив пів дня, щоб здогадатися, що відбувається з відповіддю, яку вони підтвердили, хоча це абсолютно НЕПРАВНО. На мене працював лише ваш

2

Дві проблеми:

  1. Ваша функція нічого не повертає; функція, яка явно нічого не повертає, не повертає None (що є помилковим)

  2. Правда завжди правда - ви не перевіряєте результат своєї функції

.

def check(fname, txt):
    with open(fname) as dataf:
        return any(txt in line for line in dataf)

if check('example.txt', 'blabla'):
    print "true"
else:
    print "false"

2

Як шукати текст у файлі та повертає шлях до файлу, у якому знайдено слово (

import os
import re

class Searcher:
    def __init__(self, path, query):
        self.path   = path

        if self.path[-1] != '/':
            self.path += '/'

        self.path = self.path.replace('/', '\\')
        self.query  = query
        self.searched = {}

    def find(self):
        for root, dirs, files in os.walk( self.path ):
            for file in files:
                if re.match(r'.*?\.txt$', file) is not None:
                    if root[-1] != '\\':
                        root += '\\'           
                    f = open(root + file, 'rt')
                    txt = f.read()
                    f.close()

                    count = len( re.findall( self.query, txt ) )
                    if count > 0:
                        self.searched[root + file] = count

    def getResults(self):
        return self.searched

В Майн ()

# -*- coding: UTF-8 -*-

import sys
from search import Searcher

path = 'c:\\temp\\'
search = 'search string'


if __name__ == '__main__':

    if len(sys.argv) == 3:
        # создаем объект поисковика и передаем ему аргументы
        Search = Searcher(sys.argv[1], sys.argv[2])
    else:
        Search = Searcher(path, search)

    # начать поиск
    Search.find()

    # получаем результат
    results = Search.getResults()

    # выводим результат
    print 'Found ', len(results), ' files:'

    for file, count in results.items():
        print 'File: ', file, ' Found entries:' , count

Якщо у вас є запитання щодо цієї теми, на які відповіді не відповідають цим запитанням, будь ласка, поставте нове запитання у верхньому правому куті.
Sumurai8

1

знайдено = Неправдиво

def check():
    datafile = file('example.txt')
    for line in datafile:
        if blabla in line:
            found = True
            break
    return found

if check():
    print "true"
else:
    print "false"

1

Якщо користувач хоче шукати слово в даному текстовому файлі.

 fopen = open('logfile.txt',mode='r+')

  fread = fopen.readlines()

  x = input("Enter the search string: ")

  for line in fread:

      if x in line:

          print(line)

0
found = False
def check():
datafile = file('example.txt')
for line in datafile:
    if "blabla" in line:
        found = True
        break
return found

if check():
    print "found"
else:
    print "not found"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.