从Python中的大数据文件中提取特定列数据

时间:2016-11-08 17:41: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:列表索引超出范围

4 个答案:

答案 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

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

答案 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])