簡體   English   中英

如何在python中逐塊讀取文件

[英]How to read a file block-wise in python

我在逐塊讀取文件時遇到了麻煩,並且在獲取每個塊中的某些選擇性數據方面遇到了困難:

這是我的文件內容:

DATA.txt

#-----FILE-----STARTS-----HERE--#
#--COMMENTS CAN BE ADDED HERE--#

BLOCK IMPULSE DATE 01-JAN-2010 6 DEHDUESO203028DJE \
    SEQUENCE=ai=0:at=221:ae=3:lu=100:lo=NNU:ei=1021055:lr=1: \
    USERID=ID=291821 NO_USERS=3 GROUP=ONE id_info=1021055 \
    CREATION_DATE=27-JUNE-2013 SN=1021055  KEY ="22WS \
    DE34 43RE ED54 GT65 HY67 AQ12 ES23 54CD 87BG 98VC \
    4325 BG56"

BLOCK PASSION DATE 01-JAN-2010 6 DEHDUESO203028DJE \
    SEQUENCE=ai=0:at=221:ae=3:lu=100:lo=NNU:ei=324356:lr=1: \
    USERID=ID=291821 NO_USERS=1 GROUP=ONE id_info=324356 \
    CREATION_DATE=27-MAY-2012 SN=324356  KEY ="22WS \
    DE34 43RE 342E WSEW T54R HY67 TFRT 4ER4 WE23 XS21 \
    CD32 12QW"

BLOCK VICTOR DATE 01-JAN-2010 6 DEHDUESO203028DJE \
    SEQUENCE=ai=0:at=221:ae=3:lu=100:lo=NNU:ei=324356:lr=1: \
    USERID=ID=291821 NO_USERS=5 GROUP=ONE id_info=324356 \
    CREATION_DATE=27-MAY-2012 SN=324356  KEY ="22WS \
    DE34 43RE 342E WSEW T54R HY67 TFRT 4ER4 WE23 XS21 \
    CD32 12QW"

#--BLOCK--ENDS--HERE#
#--NEW--BLOCKS--CAN--BE--APPENDED--HERE--#      

我只對每個塊的塊名,NO_USERS和id_info感興趣。 這三個數據將保存到一個數據結構中(更進一步說是dict),然后進一步存儲在一個列表中:

[{Name: IMPULSE ,NO_USER=3,id_info=1021055},{Name: PASSION ,NO_USER=1,id_info=324356}. . . ]

可以保存信息的任何其他數據結構也可以。

到目前為止,我已經嘗試通過逐行讀取來獲取塊名稱:

fOpen = open('DATA.txt')
unique =[]
for row in fOpen:
    if "BLOCK" in row:
        unique.append(row.split()[1])
print unique

我正在考慮使用正則表達式方法,但是我不知道從哪里開始。 任何幫助將不勝感激。同時我也正在嘗試,如果我得到什么會更新。 請幫忙 。

您可以使用groupy查找每個塊,使用正則表達式提取信息並將值放入字典中:

from itertools import groupby
import re


with open("test.txt") as f:
    data = []
    # find NO_USERS= 1+ digits or id_info= 1_ digits
    r = re.compile("NO_USERS=\d+|id_info=\d+")
    grps = groupby(f,key=lambda x:x.strip().startswith("BLOCK"))
    for k,v in grps:
        # if k is True we have a block line
        if k:
            # get name after BLOCK
            name = next(v).split(None,2)[1]
            # get lines after BLOCK and get the second of those
            t = next(grps)[1]
            # we want two lines after BLOCK
            _, l = next(t), next(t)
            d = dict(s.split("=") for s in r.findall(l))
            # add name to dict
            d["Name"] = name
            # add sict to data list
            data.append(d)

print(data)

輸出:

 [{'NO_USERS': '3', 'id_info': '1021055', 'Name': 'IMPULSE'},
 {'NO_USERS': '1', 'id_info': '324356', 'Name': 'PASSION'}, 
{'NO_USERS': '5', 'id_info': '324356', 'Name': 'VICTOR'}]

或沒有groupby,因為您的文件遵循一種格式,我們只需要提取BLOCK行之后的第二行:

with open("test.txt") as f:
    data = []
    r = re.compile("NO_USERS=\d+|id_info=\d+")
    for line in f:
        # if True we have a new block
        if line.startswith("BLOCK"):
            # call next twice to get thw second line after BLOCK
            _, l = next(f), next(f)
            # get name after BLOCK
            name = line.split(None,2)[1]
            # find our substrings from l 
            d = dict(s.split("=") for s in r.findall(l))
            d["Name"] = name
            data.append(d)

print(data)

輸出:

[{'NO_USERS': '3', 'id_info': '1021055', 'Name': 'IMPULSE'}, 
{'NO_USERS': '1', 'id_info': '324356', 'Name': 'PASSION'}, 
{'NO_USERS': '5', 'id_info': '324356', 'Name': 'VICTOR'}]

要提取值,您可以迭代:

for dct in data:
    print(dct["NO_USERS"])

輸出:

3
1
5

如果您想要聽寫命令並從1-n訪問每個節,則可以使用從1-n作為tke鍵存儲為嵌套聽寫:

from itertools import  count
import re

with open("test.txt") as f:
    data, cn = {}, count(1)
    r = re.compile("NO_USERS=\d+|id_info=\d+")
    for line in f:
        if line.startswith("BLOCK"):
            _, l = next(f), next(f)
            name = line.split(None,2)[1]
            d = dict(s.split("=") for s in r.findall(l))
            d["Name"] = name
            data[next(cn)] = d
   data["num_blocks"] = next(cn) - 1

輸出:

from pprint import pprint as pp

pp(data)
{1: {'NO_USERS': '3', 'Name': 'IMPULSE', 'id_info': '1021055'},
 2: {'NO_USERS': '1', 'Name': 'PASSION', 'id_info': '324356'},
 3: {'NO_USERS': '5', 'Name': 'VICTOR', 'id_info': '324356'},
 'num_blocks': 3}

'num_blocks'將准確告訴您您提取了多少個塊。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM