-1

我有一个像这样的文件:

Hi=1
How=2
Are=3
You=4
Thank=5 
You=6 
Will=7 
Be=8  
Better=9

Hi=10
How=11
Are=12
You=13
Thank=14 
You=15 
Will=16 
Be=17  
Better=18

我想获取每个(例如)第 1、第 3、第 5 行并将其存储在列表中。我知道,使用linecachewith enumaratewithitertools等获取特定行很容易。但是正如你所看到的,我在文件中迭代的行数相同,所以在从第一节获得第 1、3、5 行之后,我必须从第 2 节获得第 1、3、5 行。

所以我想让 smt 类似于:

>>>print "This is 1st row %s" %var1
>>>print "This is 3rd row %s" %var2
>>>print "This is 5th row %s" %var3
This is 1st row Hi=1 Hi=10
This is 3rd row Are=3 Are=12
This is 5th row Thank=5 Thank=14

提前谢谢你的帮助..

编辑:

关于评论,在真实文件中存在超过 60.000 节经文。每节经文都用=符号隔开。

4

2 回答 2

3

像这样使用defaultdict(list)

from collections import defaultdict
with open("abc") as f:
    dic=defaultdict(list)
    i=1
    for line in f:
          line=line.strip()
          if line:
             dic[i].append(line)
             i+=1
          else:
             i=1

for i in range(1,10,2):   #get the 1,3,5,7,9 line
   print "This is row {0}: {1}".format(i," ".join(dic[i]))

print

for i in [1,4,8]:        #get the 1,4,8 line
   print "This is row {0}: {1}".format(i," ".join(dic[i]))

输出:

This is row 1: Hi=1 Hi=10
This is row 3: Are=3 Are=12
This is row 5: Thank=5 Thank=14
This is row 7: Will=7 Will=16
This is row 9: Better=9 Better=18

This is row 1: Hi=1 Hi=10
This is row 4: You=4 You=13
This is row 8: Be=8 Be=17
于 2013-04-19T09:02:34.830 回答
1

解释:verses是一个list包含文本中所有经文的。

indexes是一个list包含您要打印的所有行的。

最后,为了打印结果,一个简单的使用zipdo the work:

  txt = """Hi=1
How=2
Are=3
You=4
Thank=5 
You=6 
Will=7 
Be=8  
Better=9

Hi=10
How=11
Are=12
You=13
Thank=14 
You=15 
Will=16 
Be=17  
Better=18"""

verses = [[]]
for line in txt.splitlines():
    if line != "":
        verses[len(verses)-1] += [line]
    else:
        verses += [[]]

indexes = [1, 3, 5]
for i, line in enumerate(zip(*verses)):
    if i+1 in indexes:
        print("This is {} row {}".format(i+1, " ".join(line)))

输出:

This is 1 row Hi=1 Hi=10
This is 3 row Are=3 Are=12
This is 5 row Thank=5  Thank=14 
于 2013-04-19T09:01:34.983 回答