Python中从海量数据文件中提取特定列数据

2024-06-02 08:49:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个巨大的数据文件,其中包含以下格式的数据:

[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: list index out of range


Tags: comuidbindversionexampletypeouconn
3条回答

我只建议运行调试器,看看它在fh中哪个line崩溃。也许太明显了,但很可能有用。你知道吗

粗略猜测您的输入文件包含空行或不符合数据格式的行。试试下面

with open("C:\\test") as fh:
    for line in fh:
        if 'uid=' in line:
            print line.split()[-1].split('=')[2].split(',')[0]

您可以使用正则表达式:

下面是一个示例,其中包含数据文件中的一行文本。你知道吗

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

print re.findall(r'uid=(.*?),',s)[0]
# prints user1

工作示例:http://www.codeskulptor.org/#user42_0jDArlYoNk_0.py


更新

如果您的字符串不包含用户标识,则可能会遇到错误。因此,您可以尝试try/except或类似的方法:

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

可以找到代码 http://www.codeskulptor.org/#user42_0jDArlYoNk_1.py

相关问题 更多 >