从文本文件中读取特定的Python列表

时间:2016-05-29 19:51:51

标签: python python-3.x

我目前正在尝试读取文件中冒号':'后发生的所有数据。 在仅包含:

的文本文件中
  

SAM帐户类型:805306368

with open("Sample.txt") as myfile:
for line in myfile:
        flag=0
        if ("SAM Account Type" in line):
            for ch in line:
                if (flag and ch!=' ' and ch!='\n'):
                    B+=ch
                elif (ch == ':'):
                    flag+=1
                    S1 = myfile.read(10)
                   # print (ch)
                elif (ch=='\n'):
                    flag =0
                else:
                    pass
            print (B)

这就像一个只显示我的魅力“805306368” 但是当我尝试使用列表检查“SAM帐户类型”以外的更多变量时,它无法提供正确的输出。

例如下面的文件:

  

SAM帐户名称:Ramachandran。 S

     

SAM帐户类型:805306368

     

描述:

     

用户帐户控制:544

     

创建时间:09/21/2015 06:33:53

     

Lastlogontimestamp:130966421275783509

     

更改时间:01/07/2016 12:08:47

     

帐户到期日期:922337203685477580

     

上次注销:00:00:00.0000000

     

上次登录:130971364125825724

以下代码:

A = []
A.extend({"SAM Account Type",
"User Account Control",
"Last logon",
"Lastlogontimestamp",
"Last logoff",
"Account Expires"})
B = ""

with open("Sample.txt") as myfile:
    for line in myfile:


        for i in range(len(A)):
            flag=0
            if (str(A[i]) in line):
            #if ("SAM Account Type" in line):
                for ch in line:
                    if (flag and ch!=' ' and ch!='\n'):
                        B+=ch
                    elif (ch == ':'):
                        flag+=1
                        S1 = myfile.read(10)

                    elif (ch=='\n'):
                        flag =0
                    else:
                        pass
                print (B)
                B=""

其中所有字符读取属于列表'A'中的实体的':'后将所有字符存储在'B'中,并为每行打印B.

给出以下内容:

  

'805306368'
  '544'
  '130966421275783509'
  '922337203685477580'
  '130971364125825724'

什么时候应该给'上次注销',即'00:00:00.0000000' 但它不起作用。任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:5)

我认为您可以阅读所有行并根据您的要求处理它们。您可以根据":"分割句子。并使用令牌。

注意:由于时间也有:在其中,你可能想要使用" :" (带2个空格的冒号)

示例代码:

In [1]: with open("./input.txt") as f: 
   ...:     data = f.readlines()
   ...:     


In [2]: data = [d for d in data if d!='\n'] #Drop empty lines

In [3]: data = [d[:-1].split(" : ") for d in data] # exclude \n (last char in the line) and split based on colon

In [4]: data
Out[4]: 
[['SAM Account Name', 'Ramachandran. S'],
 ['SAM Account Type', '805306368'],
 ['Description :'],
 ['User Account Control', '544'],
 ['When Created:09/21/2015 06:33:53'],
 ['Lastlogontimestamp', '130966421275783509'],
 ['When Changed', '01/07/2016 12:08:47'],
 ['Account Expires', '922337203685477580'],
 ['Last logoff', '00:00:00.0000000'],
 ['Last logon', '130971364125825724']]

此外,

  1. 您可以使用从处理中获得的键和值对将其转换为dict。稍后您可以将此dict转储给json以执行其他任务。
  2. 好像你是从C语言来到python。在python中,大多数内容都是内置的,比如读取文件,分割字符串等等。所以,请参考一些教程,如https://developers.google.com/edu/python/等,以了解更多信息

答案 1 :(得分:1)

当您扫描特定字符串(即A中的字符串)时,我会在您的文件中创建每行的列表。

将每一行拆分为' : ',这似乎是您的密钥与txt文件中的值之间的标准间隔。

您现在有一个列表,您可以扫描B并将此列表的第一个元素与A的内容进行比较。我们可以打印第二个元素(每个匹配后' : '之后显示的内容:

B=[]

with open("Sample.txt") as f:
  for line in f:
    B.append(line.split(' : ') 
for i in B:
  if i[0] in A:
    print i[1].strip()  #this removes the \n

另一种“有趣”的方法是创建字典

c={}
with open("Sample.txt") as f:
  for line in f:
   t=line.split(' : ')
   c.update({t[0]:t[1].split()})
for i in set(c.keys()) & set(A):  #gives set of matches between keys and A
  print c[1]

如果你涉及整个简洁的事情:

for i in open("Sample.txt").readlines():
  if i[:i.index(' : ')] in A:
    print i[i.index(' : ')+3:].split()[0]

最后:

print ''.join([i[i.index(' : ')+3:] for i in open("Sample.txt").readlines() if i[:i.index(' : ')] in A])

答案 2 :(得分:0)

如果你想要做的只是打印第一个冒号右边的值,如果他们在A中有一个字符串,那么你可以:

for line in myfile:
    split_line = line.split(' : ', 1) #splits into list of two elements at first colon unless colon is not found, then a list of one element
    if split_line[0] in A and len(split_line)==2:
        print split_line[1].replace('\n', '')