новичок в Python - как прочитать содержимое нескольких файлов в уникальные списки? - PullRequest
1 голос
/ 14 сентября 2011

Я хотел бы прочитать содержимое нескольких файлов в уникальные списки, которые я могу вызвать позже - в конечном счете, я хочу преобразовать эти списки в наборы и выполнять пересечения и вычитания из них.Это, должно быть, невероятно наивный вопрос, но, перебирая разделы итераторов и циклов «Учебного питона» Лутца, я не могу понять, как к этому подойти.Вот что я написал:

#!/usr/bin/env python

import sys

OutFileName = 'test.txt'
OutFile = open(OutFileName, 'w')

FileList = sys.argv[1: ]
Len = len(FileList)
print Len

for i in range(Len):
    sys.stderr.write("Processing file %s\n" % (i))
    FileNum = i

for InFileName in FileList:
    InFile = open(InFileName, 'r')
    PathwayList = InFile.readlines()
    print PathwayList
    InFile.close()

С парой простых тестовых файлов я получаю вывод, подобный этому:

Обработка файла 0

Обработка файла1

['alg1 \ n', 'alg2 \ n', 'alg3 \ n', 'alg4 \ n', 'alg5 \ n', 'alg6'] * ​​1011 *

['csr1 \ n ',' csr2 \ n ',' csr3 \ n ',' csr4 \ n ',' csr5 \ n ',' csr6 \ n ',' csr7 \ n ',' alg2 \ n ',' alg6 ']

Эти списки верны, но как мне назначить каждый из них уникальной переменной, чтобы я мог вызвать их позже (например, включив индекс # из диапазона в имя переменной)?

Большое спасибо за то, что вы указали начинающему программисту правильное направление!

Ответы [ 6 ]

2 голосов
/ 14 сентября 2011
#!/usr/bin/env python

import sys

FileList = sys.argv[1: ]
PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % (i))
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()

Предполагая, что вы читаете в двух файлах, следующее будет выполнять построчное сравнение (оно не выберет лишние строки в более длинном файле, но тогда они не будут одинаковыми, если у одного будет большестрок, чем другие;)

for i, s in enumerate(zip(PathwayList[0], PathwayList[1]), 1):
    if s[0] == s[1]:
        print i, 'match', s[0]
    else:
        print i, 'non-match', s[0], '!=', s[1]

Для того, что вы хотите сделать, вы можете взглянуть на модуль difflib в Python.Для сортировки посмотрите Типы изменяемых последовательностей , someListVar.sort() отсортирует содержимое someListVar на месте.

1 голос
/ 14 сентября 2011

По сути, у вас есть список файлов, и вы хотите перейти к списку строк этих файлов ...

Несколько способов:

result = [ list(open(n)) for n in sys.argv[1:] ]

Это даст вам результат, подобный -> [['alg1', 'alg2', 'alg3'], ['csr1', 'csr2' ...]] Доступ будет похож на 'result [0]' что приведет к ['alg1', 'alg2', 'alg3'] ...

Несколько лучше может быть словарь:

result = dict( (n, list(open(n))) for n in sys.argv[1:] )

Если вы хотите просто объединить, вам просто нужно связать его:

import itertools
result = list(itertools.chain.from_iterable(open(n) for n in sys.argv[1:]))
# -> ['alg1', 'alg2', 'alg3', 'csr1', 'csr2'...

Не новички для начинающих ... однако сейчас было бы неплохо попытаться понять, что происходит :)

1 голос
/ 14 сентября 2011

Возможно, вы захотите проверить модуль Python fileinput , который является частью стандартной библиотеки и позволяет обрабатывать несколько файлов одновременно.

1 голос
/ 14 сентября 2011

Вы можете сделать это так, если вам не нужно запоминать, откуда исходит содержимое:

PathwayList = []
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList.append(InFile.readlines())
    InFile.close()  

for contents in PathwayList:
    # do something with contents which is a list of strings
    print contents  

или, если вы хотите отслеживать имена файлов, вы можете использовать словарь:

PathwayList = {}
for InFileName in FileList:
    sys.stderr.write("Processing file %s\n" % InFileName)
    InFile = open(InFileName, 'r')
    PathwayList[InFile] = InFile.readlines()
    InFile.close()

for filename, contents in PathwayList.items():
    # do something with contents which is a list of strings
    print filename, contents  
0 голосов
/ 14 сентября 2011

Вам нужен список, содержащий ваши списки PathwayList, то есть список списков.

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

0 голосов
/ 14 сентября 2011

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

что-то вроде , это даст вам старт

...