Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查txt文件中特定单词所有行的前5个字符?_Python_Python 3.x - Fatal编程技术网

Python 如何检查txt文件中特定单词所有行的前5个字符?

Python 如何检查txt文件中特定单词所有行的前5个字符?,python,python-3.x,Python,Python 3.x,我正在使用python制作一个简单的信息检索程序,该程序获取一个clientID,用户的客户端id是txt文件每行的前5个字符,如下所示 RYMAU ELOWE RUKUM KLKID LAJON 我希望用户输入一个5个字母的id,并在我得出以下结论的那一刻,检查每一行中是否有一个特定的客户端id: clientID = input('Enter your clientID : ') fob = open('clientRecords.txt', 'r') # opens file stor

我正在使用python制作一个简单的信息检索程序,该程序获取一个clientID,用户的客户端id是txt文件每行的前5个字符,如下所示

RYMAU
ELOWE
RUKUM
KLKID
LAJON
我希望用户输入一个5个字母的id,并在我得出以下结论的那一刻,检查每一行中是否有一个特定的客户端id:

clientID = input('Enter your clientID : ')

fob = open('clientRecords.txt', 'r') # opens file stores it in a var called fob and reads from it
if (clientID in fob.readline(5)):
    print('Access granted')
else:
    print('Access denied')
fob.close()
但这只检查第一行的前5个字母,而不是全部

以下是文本文件的实际外观:

NeQua,High,Running,5,Swimming,40,Aerobics,40,Football,20,Tennis,10
ImKol,Moderate,Walking,40,Hiking,0,Cleaning,40,Skateboarding,30,Basketball,20
YoTri,Moderate,Walking,20,Hiking,30,Cleaning,40,Skateboarding,20,Basketball,40
RoDen,High,Running,20,Swimming,20,Aerobics,40,Football,30,Tennis,50
NaThe,Moderate,Walking,30,Hiking,30,Cleaning,20,Skateboarding,10,Basketball,30
ReWes,Moderate,Walking,30,Hiking,20,Cleaning,50,Skateboarding,40,Basketball,20
BrFre,High,Running,20,Swimming,30,Aerobics,30,Football,30,Tennis,20
KaDat,High,Running,30,Swimming,20,Aerobics,10,Football,20,Tennis,30
ViRil,High,Running,50,Swimming,50,Aerobics,60,Football,40,Tennis,50
TrGeo,High,Running,10,Swimming,20,Aerobics,30,Football,30,Tennis,20
DaWay,High,Running,60,Swimming,50,Aerobics,40,Football,50,Tennis,50
CaAma,High,Running,30,Swimming,20,Aerobics,10,Football,20,Tennis,30
ArRes,High,Running,0,Swimming,10,Aerobics,30,Football,20,Tennis,20
BeVic,High,Running,20,Swimming,20,Aerobics,30,Football,30,Tennis,10
MaFre,High,Running,10,Swimming,20,Aerobics,20,Football,40,Tennis,30
AnMer,Moderate,Walking,40,Hiking,30,Cleaning,30,Skateboarding,20,Basketball,30
SaBro,Moderate,Walking,30,Hiking,20,Cleaning,30,Skateboarding,20,Basketball,20
PoLig,Moderate,Walking,20,Hiking,20,Cleaning,20,Skateboarding,30,Basketball,30
HeZbe,Moderate,Walking,30,Hiking,40,Cleaning,20,Skateboarding,40,Basketball,10
GiLop,Moderate,Walking,40,Hiking,0,Cleaning,30,Skateboarding,40,Basketball,20
DeTur,Moderate,Walking,10,Hiking,0,Cleaning,10,Skateboarding,30,Basketball,30
LaKin,Moderate,Walking,20,Hiking,20,Cleaning,30,Skateboarding,30,Basketball,20
AnVen,Moderate,Walking,50,Hiking,0,Cleaning,50,Skateboarding,50,Basketball,20
LoLew,Moderate,Walking,10,Hiking,20,Cleaning,10,Skateboarding,30,Basketball,40
NyRed,Moderate,Walking,0,Hiking,0,Cleaning,0,Skateboarding,0,Basketball,20

您需要阅读所有行,并测试每行的前五个字符:

with open('clientRecords.txt') as fob:
    allowed_access = any(line.startswith(clientID) for line in fob)
if allowed_access:
    print('Access granted')
else:
    print('Access denied')
allowed\u access
将是
True
如果文件中的任何行以提供的前缀开头,它将在找到匹配项后立即停止检查行

注意:为了避免作弊,您可能需要验证提供的
clientID
实际上有五个字符长

如果要获取与该ID关联的行,而不仅仅是该ID是否存在,则可以将该检查修改为:

with open('clientRecords.txt') as fob:
    access_data = next((line for line in fob if line.startswith(clientID)), None)
if access_data is not None:  # clientID exists, and access_data is the line it was found on
此外,如果您经常执行此测试,并且记录文件很少更改,则可能需要在内存中缓存以减少I/O工作。您将在一次预先加载有效ID(而不是在任何验证用户的循环或事件处理程序中):

然后,每次登录测试简化为:

if clientID in known_users:
    print('Access granted')
else:
    print('Access denied')
它将立即运行(出于所有目的),而不是在每次测试中重新打开和读取文件的有意义的成本。您可能需要一个过时超时,在此之后,您需要每隔一段时间重新设置
已知用户
,或者
os.stat
文件,并在文件被修改时重新设置

获取关联行的版本为:

with open('clientRecords.txt') as fob:
    known_users = {line[:5]: line for line in fob}
以及检查/查找:

access_data = known_users.get(clientID)  # Returns None if the clientID is not found, or the complete line if it is found
if access_data is not None:
    print('Access granted')
else:
    print('Access denied')

将文件读入列表,其中每一行都是列表的一个元素。检查您的ID要容易得多,那么每行的前5个字符是什么意思?上面的文件示例以每行不同的字符开始..或
行.startswith(clientID,0,5)
@KevinGuan:显式的开始/结束是否对您有所帮助?我的意思是,主要的担忧是他们给出的
clientID
(哪个显式
start
/
end
无法修复,对吗?),任何要求其长度为5个字符的检查都会让你排除太长的值。我该如何给出一个条件,例如,如果它找到clientID,则允许打印访问?@ShadowRanger啊,是的。“只是一个提示。”techedryan:我添加了测试;我假设测试非常简单,不需要包含您已经编写的代码(因为
allowed\u access
是一个
bool
,意思是“是否授予访问权限”,您只需直接测试它以替换问题中的错误测试)。
access_data = known_users.get(clientID)  # Returns None if the clientID is not found, or the complete line if it is found
if access_data is not None:
    print('Access granted')
else:
    print('Access denied')