Python не пишет все записи из списка - PullRequest
1 голос
/ 19 июля 2011

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

    import time
    import os
    i=1
    a="path"
    def getfiles(dirpat):
        b = [s for s in os.listdir(dirpat)
             if os.path.isfile(os.path.join(dirpat, s))]
        b.sort(key=lambda s: os.path.getmtime(os.path.join(dirpat, s)))
        return b
    lyst=[]
    testfile='c://test.txt'
    lyst=getfiles(a)
    for x in range (0,len(lyst)):
        print lyst[x]    
        fileHandle = open (testfile, 'w' )    
        fileHandle.write ("\n".join(str(lyst[x])))
        fileHandle.close()

Отлично напечатано и отсортировано по дате

    example1.pdf
    example3.docx
    example4.docx
    exmaple2.docx
    example 5.doc

Но когда я открыл файл, он просто имел последнюю запись и отображал ее так

    e
    x
    a
    ... and so on

Просто не могу понять, в чем проблема. Если я удаляю "\ n". Присоединяйся, он просто печатает мне последнюю запись.

Спасибо заранее, Nils

Ответы [ 5 ]

4 голосов
/ 19 июля 2011

Исправьте join(), например:

'\n'.join(str(path) for path in list)

И, пожалуйста, переименуйте переменную "list", потому что list является встроенным типом данных в Python.

3 голосов
/ 19 июля 2011
import os, os.path

a="path"

def getfiles(dirpat):
    b = [s for s in os.listdir(dirpat)
         if os.path.isfile(os.path.join(dirpat, s))]
    b.sort(key=lambda s: os.path.getmtime(os.path.join(dirpat, s)))
    return b

outfile='c://test.txt'

with open(outfile, 'w') as fileHandle:
    lines = getfiles(a)
    for line in lines:
        print line
        fileHandle.write(line)

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

Вам также нужно открыть файл только один раз, а не один раз в строке. Вы обрезали файл при каждой записи. Использование with гарантирует, что дескриптор файла будет закрыт, даже если у вас есть ошибка.

Редактировать: если вам не нужно распечатывать каждую строку перед ее написанием, вы можете просто иметь одну строку внутри блока with: fileHandle.writelines(getfiles(a)).

2 голосов
/ 19 июля 2011

Поскольку вы преобразуете каждую запись в списке в str, объединение действует для каждого str, потому что они также считаются итераторами, и поэтому между ними ставится \n каждый символ, а не каждый элемент в списке. Изменение строки на fileHandle.write ('\n'.join(str(path) for path in list))) исправит это, как писал BasicWolf.

2 голосов
/ 19 июля 2011

Вы открываете и перезаписываете содержимое файла на каждой итерации цикла.

Передайте 'a' вызову open(path) для добавления в файл или просто откройте его один раз за пределами цикла и закройте за пределами цикла.

2 голосов
/ 19 июля 2011

Делайте это при записи файла:

fileHandle = open (file, 'w' )  
for listItem in list:
    print listItem    
    fileHandle.write (str(listItem) + "\n")
fileHandle.close()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...