【问题标题】:Read in only rows in between certain strings Python仅读取某些字符串 Python 之间的行
【发布时间】:2016-10-28 03:23:10
【问题描述】:

所以我有一个文本文件,我试图在 python 中使用 csv 读取,但是我只想要以某些字符串开头的两行之间的行。我只是读取数据没有问题,我有:

import csv
with open('path to file','r') as inf:
    reader = csv.reader(inf, delimiter=" ")

为了获取所有数据,我可以循环并附加到一个列表中:

raw_data=[]
for row in reader:
    raw_data.append(row)

我知道我可以通过执行以下操作获得我想要的行:

for row in raw_data:
    if row[0] == 'string1':
        begin_idx = raw_data.index(row)
    elif row[0] == 'string2':
        end_idx = raw_data.index(row)
data=[]
for idx in range(begin_idx+1,end_idx):
    data.append(raw_data[idx])

但是,当我第一次遍历文本文件时,我希望能够一次完成所有这些操作,因此,如果有人对如何完成此操作有任何想法,将不胜感激。

注意,我不只是在寻找我想要的行的索引的原因是因为它们只是一个整数列表,每次我运行它都会改变。我运行的 pdf 到文本的转换不是很干净,所以行标题与行的实际数据不一致。

【问题讨论】:

  • Aside:您的第二个代码 sn-p 可以等效为:raw_data = list(reader)
  • 你也可以用data = raw_data[begin_idx + 1, end_idx]代替最后一个循环。

标签: python csv


【解决方案1】:

迭代器对象很好,因为当使用in 时,它们只是在像reader 这样的对象上调用next() 因此,当您击中起始字符串时,这将允许您通过单独循环通过一个线性通道来完成此操作。试试这个:

import csv
with open('path to file','r') as inf:
    reader = csv.reader(inf, delimiter=" ")

data=[]
for row in reader:
    if row[0] == 'string1':
        for row in reader:
            if row[0]=='string2':
                break
            data.append(row)

【讨论】:

  • 这符合我的想法,但就是不知道如何实现,谢谢。
  • 没问题!作为一个说明,通常我会反对重新使用/覆盖像row这样的变量名,但我认为它在这里是合适的
【解决方案2】:

您可以在 for 循环中引入状态变量:

data = []
copying = False
for row in reader:
    if copying:
        data.append(row)
    if row[0] == 'string1':
        copying = True
    if row[0] == 'string2':
        copying = False

【讨论】:

  • 您也可以break 循环而不是将copying 设置回False,尽管这仅在string2 从未出现在string1 之前才有效。如果我没记错的话,string2 不应该在 data 中,所以你需要将最后一个条件移到顶部。
  • @xZise 是的,我不希望 string2data 中,将最后一个条件移到开头确实有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-02-09
相关资源
最近更新 更多