Python 仅读取某些字符串之间的行

Python 仅读取某些字符串之间的行,python,csv,Python,Csv,所以我有一个文本文件,我正试图用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) 我知道我可以通过

所以我有一个文本文件,我正试图用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到文本转换不是非常干净,因此行标题与行的实际数据不一致。

您可以在
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

您可以在
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

迭代器对象很好,因为当在 因此,当你点击起始字符串时,这将允许你在一个线性过程中通过单独的循环来完成这个过程。试试这个:

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)

迭代器对象很好,因为当在 因此,当你点击起始字符串时,这将允许你在一个线性过程中通过单独的循环来完成这个过程。试试这个:

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)

旁白:您的第二个代码段可以等效为:
raw\u data=list(reader)
。您也可以执行
data=raw\u data[begin\u idx+1,end\u idx]
而不是最后一个循环。旁白:您的第二个代码段可以等效为:
raw\u data=list(reader)
。您还可以执行
data=raw\u data[begin\u idx+1,end\idx]
而不是最后一个循环。您也可以
中断
循环,而不是设置
复制回
False
,尽管这仅在
string2
之前从未出现过
string1
时有效。如果我没有弄错的话,
string2
不应该在
data
中,所以您需要将最后一个条件移到顶部。@xZise是的,我不想在
data
中使用
string2
,将最后一个条件移到开头确实有效。您也可以
中断循环,而不是将
复制
返回到
False
,尽管这仅在
string2
之前从未出现
string1
时有效。如果我没弄错的话,
string2
不应该在
data
中,因此您需要将最后一个条件移到顶部。@xZise是的,我不想在
data
中使用
string2
,将最后一个条件移到开头确实有效。这与我的想法一致,但就是想不出如何实现它,谢谢。没问题!请注意,通常我反对重复使用/覆盖变量名,如
,但我认为这是适当的。这与我的想法一致,但就是不知道如何实现,谢谢。没问题!作为说明,通常我反对重复使用/覆盖变量名,如
,但我认为这在这里是合适的