如何读取第二行和第三行,然后每五行读取一次:第二,第三,第七,第八,十二,十三等

时间:2019-08-25 18:03:02

标签: python line

我正在尝试从python中的文本文件中读取某些行。

我的文本文件:

Data Set    
for this Event    
d1: p, t, h = 9, 12, 30    
d2: p, t, h = 12, 22, 11    
Data Set     
for this Event    
d1: p, t, h = 9, 12, 30    
d2: p, t, h = 12, 22, 11

etc. 

我该如何读取第二行和第三行,然后读取第七行,第八行,第十二行,第十三行,以便只读取包含数据的行,而跳过具有此事件的数据集的行。

这是我尝试过的:

with open("d.txt") as f:

   for line2 in f.read().split("\n")[2::5]:
     print(line2)
   for line3 in f.read().split("\n")[3::5]:
     print(line3)
while line2:
   line = []
   line.append(line2)
   print(line)

但这只会给我第二,第七,十二,十七等行。我没有得到第2、3、7、8、12、13等行,这是在做错什么?如果我写line.append(line3),则会收到以下错误:

Traceback (most recent call last):
  File "write.py", line 9, in <module>
    line.append(line3)
NameError: name 'line3' is not defined

任何指导将不胜感激!

编辑:在查看了答案和评论之后,我现在尝试将以下内容写为我的代码:

from itertools import tee, islice
with open("d.txt") as f:
f1 = islice(f, 2, None, 5)
f2 = islice(f ,3, None, 5)

for l1, l2 in f1, f2:
    #print(f "{l1} --- {l2}")
    pass

但是,我现在收到一个错误,我不明白为什么会这样: 追溯(最近一次通话):   文件“ write.py”,第6行,在     对于f1,f2中的l1,l2: ValueError:太多值无法解压缩

我现在仍然真的不知道如何解决此代码。任何进一步的指导将不胜感激!

4 个答案:

答案 0 :(得分:0)

f.read()耗尽了要从文件中读取的剩余字符的内部缓冲区。这意味着,如果您连续两次调用f.read(),则第一个调用将起作用,而第二个调用将不起作用(由于第一个调用耗尽了文件,它将返回一个空字符串)。您必须使用seek()方法将内部字符光标放回到文件的开头。另外,只需先阅读所有行,然后再进行其余操作即可。

with open("d.txt") as f:

    lines = f.readlines()

    for line2 in lines[2::5]:
        #...
    for line3 in lines[3::5]:
        #...

另一种选择是使用正则表达式来匹配和保留仅遵循您要查找的模式的那些行。

答案 1 :(得分:0)

正如其他人指出的那样,您没有得到期望的答案的一个原因是,您在第一次遍历生成器之后就在使用生成器。

一种解决此问题的方法是,您可以利用以下事实:要读取的行号只有四个值,以10为模。 2、3、7、8、12、13、17、18,...,然后使用enumerate仅读取所需的行。

valid = {2, 3, 7, 8}

with open("file.txt", "r") as fh:
    for n, line in enumerate(fh.readlines()):
        if n % 10 in valid:
            print(line)

答案 2 :(得分:0)

问题在于文件对象fiterator,因此遍历文件对象后就用光了。

您可以使用f.seek(0)回到@ user10987432所说的开头,也可以使用itertools.tee()

itertools.tee()允许您从一个迭代器中创建多个独立的迭代器。

from itertools import tee, islice
with open('foo') as f:
    f1, f2 = tee(f)
    for l1, l2 in zip(islice(f1, 2, None, 5), islice(f2, 3, None, 5)):
        print(f'{l1}  ---  {l2}')

将打印

d1: p, t, h = 9, 12, 30
  ---  d2: p, t, h = 12, 22, 11

d1: p, t, h = 9, 12, 30
  ---  d2: p, t, h = 12, 22, 11

\n不会自动删除(至少在我的测试中如此),因此您需要自己处理

答案 3 :(得分:0)

要选择行[2、3、7、8、12、13、17、18 ...],可以检查其模5的索引等于2还是3。

因此,给定行索引i

library(dplyr)
results <- data.frame(results = rbinom(100,1, 0.5)) %>% 
  mutate(prev_result = lag(results))

prop.table(table(results$prev_result, results$results))

但是Python索引从0开始,所以您实际需要的是其索引模5等于1或2的行。

if (i % 5 == 2 or i % 5 == 3):
    # append row to list of relevant rows