关于嵌套循环的问题
我刚开始学习编程,遇到了一些关于嵌套循环的问题。我有一份数据列表,想从一个更大的文件中提取数据。我已经成功地从这个大文件中提取了一项数据,但我需要从成千上万的试验中提取100个不同的试验。每个试验在大文件中占据一行数据。这是我用来逐行提取数据的程序,下面这个例子是提取试验1的数据。这个程序是我参考之前的问题和教程写的。问题是,我不需要试验1到100,或者任何有序的模式。我需要的是试验134、274、388等等,数据是随机的。所以我不知道如何使用for循环来做嵌套循环,因为它没有一个我可以输入的范围。希望能得到一些帮助,谢谢。
completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')
for line in completedataset:
if 'trial1' in line: smallerdataset(line)
completedataset.close()
smallerdataset.close()
我真的想这样做:
trials = ('trial12', 'trial23', 'trial34')
for line in completedataset: for trial in trials: if trial in line: smallerdataset(line)
但是这样不行。有没有人能帮我修改这个程序,让它正常工作?
8 个回答
你可以这样做:
trials = ['trial1', 'trial134', 'trial274']
for line in completedataset:
for trial in trials:
if trial in line: smallerdataset(line)
为了提高效率,你可以用 'trial[0-9]+' 这个正则表达式来匹配每一行,然后查看这个符号是否能在一个集合中找到。
如果你知道每次读取的数据大小是固定的,比如每行有多少个字节,你可以用 file.seek(n)
这个命令来指定从哪个字节开始读取,其中 n
就是你想开始的位置。例如,如果文件中的每一行都是3个字节长,你可以这样做:
myfile = open('file.txt', 'r')
myfile.seek(lineToStartAt * 3)
myfile.readline()#etc
但是如果每行的字节数是不固定的或者你不知道有多少字节,那你就需要逐行读取文件,然后把你不需要的行丢掉(就像KLee1的回答里说的那样)
你在指定实验时可能会遇到一些问题。如果你搜索包含'trial1'的行,你也会找到包含'trial123'的行。如果你的数据集比较大,并且有一定的结构,你可以尝试在特定的字段中查找实验编号。例如,如果数据是用逗号分隔的,你可以使用csv这个包来处理。最后,使用生成器表达式代替循环会让代码看起来更简洁。如果假设实验编号在数据集的第一列,你可以这样做:
import csv
trials = ['trial134', 'trial1', 'trial56']
data = csv.reader(open('completedataset.txt'))
with open('smalldataset.txt','w') as outf:
csv.writer(outf).writerows(l for l in data if l[0] in trials)