Python 关于嵌套循环的问题
我是编程新手,在计算嵌套循环时遇到了一些问题。我有一个要从较大文件中提取的数据列表。我能够从更大的文件中成功提取一项数据,但我需要从这个包含数千个试验的更大文件中提取100个不同的试验。每个试验都是较大文件的一行数据。这是我用来一次成功提取一行数据的程序。在本例中,它提取试验1的数据。它基于我在前面的问题和教程中看到的示例。问题是我不需要1-100次试验,也不需要任何有序模式。我需要试验134、274、388等等,它会跳来跳去。因此,如果for语句没有可以输入的范围,我不知道如何使用for语句执行嵌套循环。感谢您的帮助。谢谢Python 关于嵌套循环的问题,python,loops,nested,Python,Loops,Nested,我是编程新手,在计算嵌套循环时遇到了一些问题。我有一个要从较大文件中提取的数据列表。我能够从更大的文件中成功提取一项数据,但我需要从这个包含数千个试验的更大文件中提取100个不同的试验。每个试验都是较大文件的一行数据。这是我用来一次成功提取一行数据的程序。在本例中,它提取试验1的数据。它基于我在前面的问题和教程中看到的示例。问题是我不需要1-100次试验,也不需要任何有序模式。我需要试验134、274、388等等,它会跳来跳去。因此,如果for语句没有可以输入的范围,我不知道如何使用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()
我真的很想这样做:
completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')
trials = [134, 274, 388]
completedata = completedataset.readlines()
for t in trials:
for line in completedata:
if "trial"+str(t) in line:
smallerdataset.write(line)
completedataset.close()
smallerdataset.close()
试验=(‘试验12’、‘试验23’、‘试验34’)
对于completedataset中的行:
关于审判中的审判:
如果在线试验:smallerdataset(线)
但这不起作用。有人能帮我修改一下这个程序,使它能正常工作吗?在我看来,您需要一个包含您感兴趣的所有试用号的列表。也许你可以试试这样的东西:
completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')
trials = [134, 274, 388]
completedata = completedataset.readlines()
for t in trials:
for line in completedata:
if "trial"+str(t) in line:
smallerdataset.write(line)
completedataset.close()
smallerdataset.close()
你可以这样做:
trials = ['trial1', 'trial134', 'trial274']
for line in completedataset:
for trial in trials:
if trial in line: smallerdataset(line)
为了更有效地进行操作,您可以将每一行与'trial[0-9]+'-regex匹配,并查找是否可以从集合中找到符号。如果完整集合中的每个试用都是已知的字节大小,您可以使用
文件。seek(n)
,其中n
是开始读取的字节。例如,如果文件中的每行长度为3字节,则可以执行以下操作:
myfile = open('file.txt', 'r')
myfile.seek(lineToStartAt * 3)
myfile.readline()#etc
如果每行的字节数是可变的或未知的,您只需读入行并丢弃不需要的行(如中所示)假设您提前知道测试,您可以这样做
trials = ('trial12', 'trial23', 'trial34')
for line in completedataset:
for trial in trials:
if trial in line: smallerdataset(line)
您将在指定试验的方式上遇到一些问题。如果查找包含“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)
假设您有一个函数,通过查看一行,可以告诉您该行是否是“所需的”,那么代码的正确结构将非常简单:
with open('completedataset.txt', 'r') as completedataset:
with open('smallerdataset.txt', 'w') as smallerdataset:
for line in completedataset:
if iwantthisone(line):
smallerdataset.write(line)
with
语句负责为您关闭。在Python2.7中,可以将带有s的两个合并为一个;在Python2.5中,您需要使用一个from\uuuuuu future\uuuuu import with_语句启动模块;在Python2.6(目前最流行的版本)中,上述代码是正确的形式
所以,所有的一切都可以归结为i和thisone
函数。你没有告诉我们你的台词的格式,这使得我们无法进一步帮助你。但是,假设每行中的第一个单词标识测试,例如,test432…
,并且您在名为want\u这些
的集合中有您想要的测试的编号,例如集合([113,432,251,…])
。那么,编写我想要的这个
的一个非常简单的方法可能是:
def iwantthisone(line):
firstword = line.split(None, 1)[0]
testnumber = int(firstword[4:])
return testnumber in want_these
当然,我想要这一行的正确内容完全取决于你的行的格式,以及你如何判断你实际上想要保留哪些行。但我希望这个总体结构仍然有帮助
请注意,我推荐的这个通用结构中实际上没有嵌套循环!) 关于您在注释中显示的错误消息:行继续字符是反斜杠,因此它告诉您该行中的某个位置有一个错误的反斜杠字符。假设行始终以试用标识符开头,您可以使用startswith函数和过滤器来提取所需的字符
completedataset = open('completedataset.txt', 'r')
smallerdataset = open('smallerdataset.txt', 'w')
wantedtrials = ('trial134', 'trial274', 'trial388')
for line in completedataset:
if filter(line.startswith, wantedtrials):
smallerdataset.write(line)
每次试验是否保证在相应的生产线上进行?(即第一行的trial1
,依此类推……)此外,每行的长度是否固定?如果您可以粘贴数据集文件的一个小样本,这可能会很有用。我不愿意共享文件的实际内容,但不幸的是,第655行没有试用版687。所以它们不匹配。所以我首先尝试了这个,因为它看起来最简单,一行接一行地显示意外字符,并突出显示“:”。建议?所以我先试试这个,因为它看起来最简单,一行接一行地显示意外字符,并突出显示“:”。建议?它突出显示了哪个“:”?正如Haukur所建议的,听起来好像在一行的末尾有一个反斜杠。我真的不知道我能做些什么来帮助你,而不看你的代码。