如何从Python中的文件中提取特定的值集?

时间:2011-12-02 07:28:25

标签: python

我对这里的逻辑感到困惑......我必须从一个看起来像这样的文本文件中提取一些值

AAA
+-------------+------------------+
|          ID |            count |
+-------------+------------------+
|           3 |             1445 |
|           4 |              105 |
|           9 |              160 |
|          10 |               30 |
+-------------+------------------+
BBB
+-------------+------------------+
|          ID |            count |
+-------------+------------------+
|           3 |             1445 |
|           4 |              105 |
|           9 |              160 |
|          10 |               30 |
+-------------+------------------+
CCC
+-------------+------------------+
|          ID |            count |
+-------------+------------------+
|           3 |             1445 |
|           4 |              105 |
|           9 |              160 |
|          10 |               30 |
+-------------+------------------+

我无法单独从BBB中提取值并将其附加到像

这样的列表中
f = open(sys.argv[1], "r")
text = f.readlines()
B_Values = []
for i in text:
    if i.startswith("BBB"):(Example)
       B_Values.append("only values of BBB")
    if i.startswith("CCC"):
       break

print B_Values

应该结果

['|           3 |             1445 |','|           4 |              105 |','|           9 |              160 |','|          10 |               30 |']

3 个答案:

答案 0 :(得分:3)

d = {}
with open(sys.argv[1]) as f:
    for line in f:
        if line[0].isalpha(): # is first character in the line a letter?
            curr = d.setdefault(line.strip(), [])
        elif filter(str.isdigit, line): # is there any digit in the line?
            curr.append(line.strip())

对于此文件,d现在是:

{'AAA': ['|           3 |             1445 |',
         '|           4 |              105 |',
         '|           9 |              160 |',
         '|          10 |               30 |'],
 'BBB': ['|           3 |             1445 |',
         '|           4 |              105 |',
         '|           9 |              160 |',
         '|          10 |               30 |'],
 'CCC': ['|           3 |             1445 |',
         '|           4 |              105 |',
         '|           9 |              160 |',
         '|          10 |               30 |']}

您的B_valuesd['BBB']

答案 1 :(得分:0)

您可以使用状态标志 bstarted 来跟踪B组的开始时间。 扫描B组后,删除三个标题行和一个页脚行。

B_Values = []
bstarted = False
for i in text:
    if i.startswith("BBB"):
        bstarted = True
    elif i.startswith("CCC"):
        bstarted = False
        break
    elif bstarted:
        B_Values.append(i)

del B_Values[:3]   # get rid of the header
del B_Values[-1]   # get rid of the footer
print B_Values

答案 2 :(得分:0)

您应该避免迭代已读取的行。每当您想要阅读下一行时调用readline并检查它是什么:

f = open(sys.argv[1], "r")
B_Values = []
while i != "":
    i = f.readline()
    if i.startswith("BBB"): #(Example)
        for temp in range(3):
            f.skipline() #Skip the 3 lines of table headers
        i = f.readline()
        while i != "+-------------+------------------+" and i !="":
            #While we've not reached the table footer
            B_Values.append(i)
            i = f.readline()
        break

#Although not necessary, you'd better put a close function there, too.
f.close()

print B_Values

编辑:@eumiro的方法比我的方法更灵活。因为它读取所有部分的所有值。虽然您可以在我的示例中实现isalpha测试来读取所有值,但他的方法仍然更容易阅读。