Làm thế nào để tìm kiếm một chuỗi trong tập tin văn bản?


169

Tôi muốn kiểm tra nếu một chuỗi trong một tệp văn bản. Nếu đúng, hãy làm X. Nếu không, hãy làm Y. Tuy nhiên, mã này luôn trả về Truevì một số lý do. Bất cứ ai cũng có thể nhìn thấy những gì là sai?

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"

Câu trả lời:


390

Lý do tại sao bạn luôn nhận Trueđược đã được đưa ra, vì vậy tôi sẽ chỉ đưa ra một đề xuất khác:

Nếu tệp của bạn không quá lớn, bạn có thể đọc nó thành một chuỗi và chỉ cần sử dụng nó (dễ dàng và thường nhanh hơn đọc và kiểm tra từng dòng trên mỗi dòng):

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

Một mẹo khác: bạn có thể giảm bớt các vấn đề bộ nhớ có thể bằng cách sử dụng mmap.mmap()để tạo một đối tượng "giống như chuỗi" sử dụng tệp bên dưới (thay vì đọc toàn bộ tệp trong bộ nhớ):

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')

LƯU Ý: trong python 3, mmaps hoạt động giống như bytearraycác đối tượng hơn là các chuỗi, do đó, chuỗi con bạn tìm kiếm find()phải là một bytesđối tượng chứ không phải là một chuỗi, ví dụ: 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')

Bạn cũng có thể sử dụng các biểu thức thông thường trên mmapví dụ: tìm kiếm không phân biệt chữ hoa chữ thường:if re.search(br'(?i)blabla', s):


84
Thật là tuyệt vời! Đây chính xác là lý do tại sao tôi thích stackoverflow: nó không chỉ cung cấp cho bạn một giải pháp, nó cung cấp cho bạn một lựa chọn tốt hơn. Cảm ơn :)
HankSmackHood

1
Giải pháp thứ hai không cho kết quả như 'blabla' in open('example.txt').read()trong python 2.7 của tôi
xApple 18/03/13

1
Lạ, nó hoạt động với s.find('blabla')(kiểm tra -1). Tôi có thể thề rằng nó đã từng làm việc cùng in... Nhưng dường như bây giờ inchỉ hoạt động cho các nhân vật duy nhất ...
Steven

6
if 'blabla' in open('example.txt').read(): print "true"==> Làm thế nào chúng ta có thể đóng example.txttệp trong trường hợp này?

4
opennói chung nên được gói gọn trong một withtuyên bố:with open(file_name) as fl: return text in fl.read()
Ohad Schneider

27

Như Jeffrey Said, bạn không kiểm tra giá trị của check(). Ngoài ra, check()chức năng của bạn không trả lại bất cứ điều gì. Lưu ý sự khác biệt:

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

Sau đó, bạn có thể kiểm tra đầu ra của check():

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

22

Đây là một cách khác để có thể trả lời câu hỏi của bạn bằng cách sử dụng hàm find cung cấp cho bạn một giá trị bằng số theo nghĩa đen của một cái gì đó thực sự là

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

trong find hãy viết từ bạn muốn tìm và 'file'viết tắt của tên tệp của bạn


11
if True:
    print "true"

Điều này luôn xảy ra vì True luôn luôn đúng.

Bạn muốn một cái gì đó như thế này:

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

Chúc may mắn!


Tôi thấy, nó hoạt động bây giờ. Có vẻ hơi lạ đối với tôi, điều này có nghĩa là Python nói "một mô-đun là Đúng, trừ khi có quy định khác". Vì vậy, nếu tôi tạo ra một mô-đun trống, nó sẽ luôn đúng? Thật thú vị :)
HankSmackHood

11
Không, hoàn toàn không - không có gì để làm với các mô-đun. Bạn chỉ đơn giản là kiểm tra xem True có đúng không, đó là sự thật.
Daniel Roseman

5

Tôi đã thực hiện một chức năng nhỏ cho mục đích này. Nó tìm kiếm một từ trong tệp đầu vào và sau đó thêm nó vào tệp đầu ra.

def searcher(outf, inf, string):
    with open(outf, 'a') as f1:
        if string in open(inf).read():
            f1.write(string)
  • outf là tập tin đầu ra
  • inf là tập tin đầu vào
  • chuỗi là tất nhiên, chuỗi mong muốn mà bạn muốn tìm và thêm vào outf.

4

checkHàm của bạn sẽ trả về foundboolean và sử dụng hàm đó để xác định những gì sẽ in.

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"

khối thứ hai cũng có thể được ngưng tụ thành:

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

1
Tất cả các câu trả lời ở trên là FALSE đáng kể ngoại trừ của bạn. Tôi đã dành nửa ngày để đoán những gì đang xảy ra với câu trả lời mà họ xác nhận trong khi nó hoàn toàn SAI. Chỉ của bạn làm việc cho tôi

2

Hai vấn đề:

  1. Chức năng của bạn không trả về bất cứ điều gì; một hàm không trả về một cách rõ ràng bất cứ thứ gì trả về Không có (đó là giả)

  2. True luôn luôn đúng - bạn không kiểm tra kết quả của chức năng

.

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

Làm thế nào để tìm kiếm văn bản trong tập tin và Trả về một đường dẫn tập tin trong đó từ được tìm thấy

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

Trong chính ()

# -*- 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

Nếu bạn có câu hỏi về chủ đề này không được trả lời bằng câu hỏi này, vui lòng đặt câu hỏi mới ở góc trên bên phải.
Sumurai8

1

tìm thấy = Sai

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

Nếu người dùng muốn tìm kiếm từ trong tệp văn bản nhất định.

 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.