Python 仅读取某些字符串之间的行
所以我有一个文本文件,我正试图用python中的csv读取它,但是我只想要两行之间以特定字符串开头的行。我在读取数据方面没有问题,我有: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) 我知道我可以通过
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
,将最后一个条件移到开头确实有效。这与我的想法一致,但就是想不出如何实现它,谢谢。没问题!请注意,通常我反对重复使用/覆盖变量名,如行
,但我认为这是适当的。这与我的想法一致,但就是不知道如何实现,谢谢。没问题!作为说明,通常我反对重复使用/覆盖变量名,如行
,但我认为这在这里是合适的