2011-02-09 38 views
92

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

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" 

Trả lời

226

Lý do tại sao bạn luôn có True đã được đưa ra, vì vậy tôi sẽ chỉ cung cấp một gợi ý:

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

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

một lừa: bạn có thể làm giảm bớt các vấn đề về bộ nhớ càng tốt bằng cách sử dụng mmap.mmap() để tạo ra một "chuỗi giống như" đối tượng có sử dụng các tập tin cơ bản (thay vì đọc ing toàn bộ tập tin trong bộ nhớ):

import mmap 

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

Chú ý: trong python 3, mmaps cư xử như bytearray đối tượng chứ không phải là chuỗi, do đó dãy con bạn tìm kiếm với find() có phải là một đối tượng bytes chứ không phải là một chuỗi cũng , 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ụm từ thông dụng trên mmap ví dụ:, Case-insensitive tìm kiếm: if re.search(br'(?i)blabla', s):

+43

Điều này thật tuyệt vời! Đây chính là lý do tại sao tôi yêu stackoverflow: nó không chỉ cung cấp cho bạn một giải pháp, nó mang lại 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ả tương tự như '' blabla 'trong mở (' example.txt '). Read() 'trong python của tôi 2.7 – xApple

+1

Lạ, nó hoạt động với' s.find (' blabla ') '(kiểm tra -1). Tôi có thể thề nó được sử dụng để làm việc với 'in' là tốt ... Nhưng có vẻ như bây giờ' in' chỉ hoạt động cho các ký tự đơn ... – Steven

7
if True: 
    print "true" 

này luôn luôn xảy ra vì thật luôn là True.

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!

+0

Tôi hiểu, nó hoạt động ngay bây giờ. Có vẻ hơi lạ 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 thực hiện một module rỗng, nó sẽ luôn luôn là sự thật? Thú vị :) – HankSmackHood

+6

Không, không hề - không liên quan gì đến các mô-đun. Bạn chỉ đơn giản là kiểm tra xem True có đúng hay không. –

21

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

def check(): 
     datafile = file('example.txt') 
     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 anything 


print check() 
2

chức năng check của bạn nên trả lại found boolean và sử dụng để xác định những gì để 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ụ để:

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

Tất cả các câu trả lời ở trên đều đáng kể trừ FALSE 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 là BÀI VIẾT. Chỉ có bạn làm việc cho tôi –

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 "true" 
else: 
    print "false" 
+0

Không cần phải gọi 'check()' hai lần ... – Steven

+0

typo. cảm ơn. đã sửa. – karlcow

1

Hai vấn đề:

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

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

.

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" 
11

Dưới đâ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 chức năng tìm mà cung cấp cho bạn một số giá trị văn chương của nơi một cái gì đó thực sự là

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

trong tìm viết từ bạn muốn tìm và 'file' đứng cho tên tập tin của bạn

1

Làm thế nào để tìm kiếm văn bản trong các tập tin và Trả về đường dẫn tập tin chứa nội dung 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 Main()

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

Nếu bạn có câu hỏi về chủ đề này không được trả lời bằng Giải Đáp này, hãy tạo một câu hỏi mới ở góc trên cùng bên phải. – Sumurai8

3

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à file đầu ra
  • inf là file đầu vào
  • chuỗi là tất nhiên, chuỗi mà bạn muốn để tìm và thêm vào outf.
Các vấn đề liên quan