Загрузка файла в память - PullRequest
1 голос
/ 01 октября 2011

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

Я нашел несколько потоков, которые ссылаются на модули TempFile и StringIO, но я не смог их осмыслить.

В настоящее время я загружаю все файлы и называю их последовательно как 1.txt, 2.txt и т. Д., Затем прохожу все их и извлекаю вторую строку. Я хотел бы открыть файл, взять строку и перейти к поиску, открытию и чтению следующего файла.

Вот что я сейчас делаю, записав его на жесткий диск:

while (count4 <= num_files):
    file_p = [directory,str(count4),'.txt']
    file_path = ''.join(file_p)        
    cand_summary = string.strip(linecache.getline(file_path, 2))
    linkFile = open('Summary.txt', 'a')
    linkFile.write(cand_summary)
    linkFile.write("\n")
    count4 = count4 + 1
    linkFile.close()

Ответы [ 2 ]

0 голосов
/ 01 октября 2011

Просто замените запись файла вызовом append() в списке. Например:

summary = []
while (count4 <= num_files):
    file_p = [directory,str(count4),'.txt']
    file_path = ''.join(file_p)        
    cand_summary = string.strip(linecache.getline(file_path, 2))
    summary.append(cand_summary)
    count4 = count4 + 1

В качестве отступления вы обычно пишете count += 1. Также похоже, что count4 использует индексирование на основе 1. Это кажется довольно необычным для Python.

0 голосов
/ 01 октября 2011

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

Почему бы просто не сделать

with open("Summary.txt", "w") as linkfile:
    while (count4 <= num_files):
        file_p = [directory,str(count4),'.txt']
        file_path = ''.join(file_p)        
        cand_summary = linecache.getline(file_path, 2).strip() # string module is deprecated
        linkFile.write(cand_summary)
        linkFile.write("\n")
        count4 = count4 + 1

Кроме того, linecache, вероятно, здесь не тот инструмент, так как он оптимизирован для чтения нескольких строк из одного файла, а не одной строки из нескольких файлов..

Вместо этого лучше сделать

with open(file_path, "r") as infile:
    dummy = infile.readline()
    cand_summary = infile.readline.strip()

Также, если вы отбросите метод strip(), вам не нужно повторно добавлять \n, но кто знает, почему выесть это там.Возможно, .lstrip() будет лучше?

Наконец, что с ручным циклом while?Почему бы не использовать цикл for?

Наконец, после вашего комментария я понимаю, что вы хотите поместить результат в список, а не в файл.ОК.

Всего:

summary = []
for count in xrange(num_files):
    file_p = [directory,str(count),'.txt'] # or count+1, if you start at 1
    file_path = ''.join(file_p)        
    with open(file_path, "r") as infile:
        dummy = infile.readline()
        cand_summary = infile.readline().strip()
        summary.append(cand_summary)
...