可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I want to check if a string is in a text file. If it is, do X. If it\'s not, do Y. However, this code always returns True
for some reason. Can anyone see what is wrong?
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\"
回答1:
The reason why you always got True
has already been given, so I\'ll just offer another suggestion:
If your file is not too large, you can read it into a string, and just use that (easier and often faster than reading and checking line per line):
if \'blabla\' in open(\'example.txt\').read():
print(\"true\")
Another trick: you can alleviate the possible memory problems by using mmap.mmap()
to create a \"string-like\" object that uses the underlying file (instead of reading the whole file in memory):
import mmap
f = open(\'example.txt\')
s = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
if s.find(\'blabla\') != -1:
print(\'true\')
NOTE: in python 3, mmaps behave like bytearray
objects rather than strings, so the subsequence you look for with find()
has to be a bytes
object rather than a string as well, eg. 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\')
You could also use regular expressions on mmap
e.g., case-insensitive search: if re.search(br\'(?i)blabla\', s):
回答2:
As Jeffrey Said, you are not checking the value of check()
. In addition, your check()
function is not returning anything. Note the difference:
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()
回答3:
Here\'s another way to possibly answer your question using the find function which gives you a literal numerical value of where something truly is
open(\'file\', \'r\').read().find(\'\')
in find write the word you want to find
and \'file\'
stands for your file name
回答4:
if True:
print \"true\"
This always happens because True is always True.
You want something like this:
if check():
print \"true\"
else:
print \"false\"
Good luck!
回答5:
I made a little function for this purpose. It searches for a word in the input file and then adds it to the output file.
def searcher(outf, inf, string):
with open(outf, \'a\') as f1:
if string in open(inf).read():
f1.write(string)
- outf is the output file
- inf is the input file
- string is of course, the desired string that you wish to find and add to outf.
回答6:
Your check
function should return the found
boolean and use that to determine what to print.
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\"
the second block could also be condensed to:
if check():
print \"true\"
else:
print \"false\"
回答7:
How to search the text in the file and Returns an file path in which the word is found
(Как искать часть текста в файле и возвращять путь к файлу в котором это слово найдено)
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
In 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
回答8:
Two problems:
Your function does not return anything; a function that does not explicitly return anything returns None (which is falsy)
True is always True - you are not checking the result of your function
.
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\"
回答9:
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\"