Добавление списков из файлов в один список в Python - PullRequest
0 голосов
/ 30 ноября 2009

Я пытаюсь написать функцию, которая читает файлы из «отложенного» каталога, который содержит файлы, содержащие списки. Вот что содержат файлы в отложенной папке:

'173378981', '45000', '343434', '3453453', '34534545', '3452342', '234234', '42063008', 'Exempted', '10000'
'1000014833', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009598', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'279483421', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009600', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'389453080', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'
'1000009602', '0', '0', '0', '0', '0', '0', '0', 'Exempted', '0'

Функция, используемая для записи файла (ов):

def storeDeferredRecords(records):
    """docstring for createFile"""
    now = datetime.datetime.now()
    filename = deferredDir + '/' + now.strftime("%Y%m%d-%H%M%S")
    f = open(filename, 'w')
    newlist = map(lambda(x): str(x)[1:-1], records)
    for item in newlist:
        f.write("%s\n" % item)
    f.close

Мне нужна помощь с функцией, используемой для чтения файла. Я только смог написать это:

def getDeferredRecords():
        """docstring for getDeferredRecords"""
        infiles = [infile for infile in glob.glob(deferredDir + '/*')]
                <code to read the contents of each file here>

Может ли кто-нибудь мне помочь? Мне нужно прочитать строки и вставить их в список. Затем этот список будет объединен с записями из отдельного файла CSV.

Ответы [ 4 ]

2 голосов
/ 30 ноября 2009

Во-первых, последняя строка в функции магазина должна быть такой: f.close()

Ваша функция сохранения сохраняет значения в виде новой строки. Чтобы прочитать все файлы, должно быть достаточно:

def getDeferredRecords():
    """docstring for getDeferredRecords"""
    return dict((infile, list(iter(file(infile)))) 
                     for infile in glob.glob(deferredDir + '/*'))

Объяснение: файл является итеративным, поэтому вы можете, например, сделать for line in file: print line. С list(iter(file)) у вас есть строки файла в списке. dict((a, b) for a, b in foo) возвращает словарь с {a: b} парами. Возвращаемым значением функции является словарь в формате {filename: list_of_lines_in_file}. Помните, что элементы списка являются строками с завершающим переводом строки.

1 голос
/ 30 ноября 2009

Модуль Python cvs, вероятно, является хорошим ответом:
http://docs.python.org/library/csv.html

Вопрос:

glob.glob() возвращает итерируемое уже, поэтому я не вижу смысла здесь ...

[infile for infile in glob.glob(deferredDir + '/*')]

Вместо:

BigList = []
for filename in glob.glob(deferredDir + '/*'):
    #CVS read code here
    #add to BigList

Пища для размышлений.

1 голос
/ 30 ноября 2009

См. модуль csv :

BigList = []
for filename in glob.glob(deferredDir + '/*'):
    PartList = csv.reader(open(filename))
    BigList.extend(PartList)

Это то, что вы имели в виду?

0 голосов
/ 30 ноября 2009

Включая идеи Тима Пицкера, вот переписанные функции:

def storeDeferredRecords(records):
    """docstring for createFile"""
    now = datetime.datetime.now()
    filename = deferredDir + '/' + now.strftime("%Y%m%d-%H%M%S")
    f = csv.writer(open(filename, 'w'), delimiter=',')
    f.writerows(records)

def getDeferredRecords():
    """docstring for getDeferredRecords"""
    for filename in glob.glob(deferredDir + '/*'):
        def_records = csv.reader(open(filename,'r'))
        records.extend(def_records)

Я использовал csv.writer вместо предыдущего блока кода:

f = open(filename, 'w')
newlist = map(lambda(x): str(x)[1:-1], records)
for item in newlist:
        f.write("%s\n" % item)
f.close

Спасибо всем, кто ответил!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...