จะค้นหาสตริงในไฟล์ข้อความได้อย่างไร?


170

ฉันต้องการตรวจสอบว่าสตริงอยู่ในไฟล์ข้อความหรือไม่ ถ้าเป็นเช่นนั้นให้ทำ 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"

คำตอบ:


392

เหตุผลที่คุณได้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()ใน python 2.7
xApple

1
แปลกมันใช้งานได้กับs.find('blabla')(ตรวจสอบ -1) ฉันสาบานได้ว่ามันเคยทำงานด้วยinเช่นกัน ... แต่ตอนนี้ดูเหมือนว่าinจะใช้ได้กับตัวละครเดียวเท่านั้น ...
Steven

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()
Ohad Schneider

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

ต่อไปนี้เป็นอีกวิธีในการตอบคำถามของคุณโดยใช้ฟังก์ชั่น find ซึ่งให้ค่าตัวเลขตามตัวอักษรว่ามีอะไรอยู่จริง

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

ในการค้นหาเขียนคำที่คุณต้องการค้นหาและ'file'ย่อมาจากชื่อไฟล์ของคุณ


11
if True:
    print "true"

สิ่งนี้จะเกิดขึ้นเสมอเพราะ True เป็นจริงเสมอ

คุณต้องการสิ่งนี้:

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

โชคดี!


ฉันเห็นมันใช้งานได้ในขณะนี้ ดูเหมือนว่าจะแปลกสำหรับฉัน แต่นี่หมายความว่า Python บอกว่า "โมดูลเป็นจริงเว้นแต่จะระบุไว้เป็นอย่างอื่น" ดังนั้นถ้าฉันสร้างโมดูลเปล่ามันจะเป็นจริงเสมอหรือ น่าสนใจ :)
HankSmackHood

11
ไม่ไม่เลย - ไม่มีส่วนเกี่ยวข้องกับโมดูล คุณเพียงแค่ตรวจสอบว่าจริงเป็นจริงซึ่งเป็น
Daniel Roseman

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. ฟังก์ชั่นของคุณไม่ส่งคืนสิ่งใด ฟังก์ชั่นที่ไม่ส่งคืนสิ่งใดคืนอย่างชัดเจนไม่มี (ซึ่งเป็นเท็จ)

  2. True เสมอ True - คุณไม่ได้ตรวจสอบผลลัพธ์ของฟังก์ชันของคุณ

.

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"
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.