Вопрос о вложенных циклах - PullRequest
0 голосов
/ 19 июля 2010

Я новичок в программировании и у меня возникли проблемы с вычислением вложенных циклов.У меня есть список данных, которые я хочу извлечь из файла большего размера.Я могу успешно извлечь один элемент данных из файла большего размера, но мне нужно извлечь 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')

для строки взавершенный набор: для испытания в испытаниях: если испытание в строке: меньший набор данных (строка)

, но это не работает.Может кто-нибудь помочь мне изменить эту программу, чтобы она работала правильно?

Ответы [ 8 ]

0 голосов
/ 20 июля 2010

Предполагая, что строки всегда начинаются с идентификатора пробной версии, вы можете использовать функцию стартов с фильтром и выбрать нужные.

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)
0 голосов
/ 19 июля 2010

Предполагая, что у вас есть функция, которая, глядя на строку, может сказать вам, является ли эта строка "желаемой", правильная структура вашего кода будет очень простой:

with open('completedataset.txt', 'r') as completedataset:
    with open('smallerdataset.txt', 'w') as smallerdataset:
        for line in completedataset:
            if iwantthisone(line):
                smallerdataset.write(line)

The with заявления заботятся о закрытии для вас.В Python 2.7 вы можете объединить два with в один;в Python 2.5 вам нужно запустить свой модуль с from __future__ import with_statement;в Python 2.6, в настоящее время наиболее распространенной версии, приведенный выше код является правильной формой.

Итак, абсолютно все сводится к этой iwantthisone функции.Вы ничего не говорите нам о формате ваших строк, что делает невозможным дальнейшую помощь.Но предположим, например, что первое слово в каждой строке идентифицирует тест, например, test432 ..., и у вас есть номера тестов, которые вы хотите в наборе с именем want_these, например, set([113, 432, 251, ...]).Тогда очень простой способ написать iwantthisone может быть следующим:

def iwantthisone(line):
    firstword = line.split(None, 1)[0]
    testnumber = int(firstword[4:])
    return testnumber in want_these

Надлежащее содержимое iwantthisone полностью зависит от формата ваших строк и от того, как вы скажете, какие строки на самом деле делают хочу оставить, конечно.Но я надеюсь, что эта общая структура все еще помогает.

Обратите внимание, что в этой общей структуре я не рекомендую использовать вложенные циклы! -)

0 голосов
/ 20 июля 2010

О сообщении об ошибке, которое вы видите в своих комментариях: символ продолжения строки является обратной косой чертой, поэтому он говорит вам, что у вас есть ошибочный символ обратной косой черты где-то в этой строке.

0 голосов
/ 19 июля 2010

У вас возникнут некоторые проблемы с указанием ваших испытаний. Если вы ищете строки, содержащие '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)
0 голосов
/ 19 июля 2010

Предполагая, что вы знаете испытания заранее, вы можете сделать

trials = ('trial12', 'trial23', 'trial34')

for line in completedataset:
    for trial in trials:
        if trial in line: smallerdataset(line)
0 голосов
/ 19 июля 2010

Если каждая проба в комплекте имеет известный размер в байтах, вы можете использовать file.seek(n), где n - байт, с которого начинается чтение.Например, если каждая строка в файле имеет длину 3 байта, вы можете сделать что-то вроде:

myfile = open('file.txt', 'r')
myfile.seek(lineToStartAt * 3)

myfile.readline()#etc

Если число байтов в строке является переменным или неизвестным, вам просто придется читать в строкахи отбросьте строки, которые вам не нужны (как в ответ KLee1 )

0 голосов
/ 19 июля 2010

Вы могли бы просто сделать это:

trials = ['trial1', 'trial134', 'trial274']

for line in completedataset:
    for trial in trials:
        if trial in line: smallerdataset(line)

Для более эффективной работы вы можете сопоставить каждую строку с пробным [0-9] + -regex и посмотреть, можно ли найти символ из набора.

0 голосов
/ 19 июля 2010

Мне кажется, вам нужен список, содержащий все интересующие вас пробные номера. Поэтому, возможно, вы могли бы попробовать что-то вроде этого:

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...