我有一个庞大的数据文件,其中包含以下格式的数据:
[06/Nov/2016:23:24:03 +0100] BIND REQ conn=8349228 op=0 msgID=1 version=3 type=SIMPLE dn="uid=user1,ou=Org1,ou=example,o=com"
[06/Nov/2016:23:24:03 +0100] BIND REQ conn=8349229 op=0 msgID=1 version=3 type=SIMPLE dn="uid=user2,ou=Org1,ou=example,o=com"
[06/Nov/2016:23:24:04 +0100] BIND REQ conn=8349230 op=0 msgID=1 version=3 type=SIMPLE dn="uid=user3,ou=Org1,ou=example,o=com"
[06/Nov/2016:23:24:04 +0100] BIND REQ conn=8349231 op=0 msgID=1 version=3 type=SIMPLE dn="uid=user4,ou=Org1,ou=example,o=com"
我想从此文本文件中提取uid,结果输出应如下所示:
user1
user2
user3
user4
我使用此代码来提取这些值:
with open("C:\\test") as fh:
for line in fh:
print(str(str(line.split(" ")[9]).split("=")[2]).split(",")[0])
但我收到了错误:
IndexError:列表索引超出范围
答案 0 :(得分:0)
您可以使用正则表达式执行此操作:
以下是您的数据文件中包含一行文字的示例。
try/except
工作示例:http://www.codeskulptor.org/#user42_0jDArlYoNk_0.py
更新
如果您的字符串不包含用户标识,则可能遇到错误。因此,您可以尝试import re
s = '[06/Nov/2016:23:24:03 +0100] BIND REQ conn=8349228 op=0 msgID=1 version=3 type=SIMPLE dn="uid=user1,ou=Org1,ou=example,o=com"'
errors= []
result = re.findall(r'uid=(.*?),',s)
if len(result):
print result[0]
else:
errors.append(s)
if len(errors):
print "\n Errors were encountered with the following strings"
for error in errors:
print error
或类似的内容:
from Crypto.Cipher import AES
答案 1 :(得分:0)
粗略猜测您的输入文件包含空行或某些不符合数据格式的行。请尝试以下
with open("C:\\test") as fh:
for line in fh:
if 'uid=' in line:
print line.split()[-1].split('=')[2].split(',')[0]
答案 2 :(得分:0)
我只是建议运行调试器并查看line
中崩溃的fh
。也许太明显但很有可能它起作用。
答案 3 :(得分:0)
我发现文件中有一些行有空格" "在uid字段之后,所以我以另一种方式拆分文件,它似乎对我有用。这就是我拆分文件的方式。
print(line.split()[-1].split(",")[0])