2014-01-03 3 views
0

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

У меня есть сценарий Python, который будет читать содержимое текстового файла, разбивать его содержимое на слова, а затем выводить CSV-файл, который уменьшил текст до списка частот слов. (В конце концов я вставлю строку, чтобы отбросить слова, но я так далеко не достиг.) Что бы я хотел сделать дальше с этим скриптом, это указать его в каталог текстовых файлов и перепрограммировать эти файлы, создав соответствующий CSV-файл для каждого TXT-файла.

Вот что я до сих пор:

#! /usr/bin/env python 

import glob 
import re 
import csv 

files = {} 
for fpath in glob.glob("*.txt"): 
    with open(fpath) as f: 
     words = re.split('\s+', f.read().lower()) 
     freq_dic = {} 
     punctuation = re.compile(r'[.?!,":;]') 
    for word in words: 
     word = punctuation.sub("", word) 
     try: 
      freq_dic[word] += 1 
     except: 
      freq_dic[word] = 1 
    word_list = [(val, key) for key, val in freq_dic.items()] 
    sorted(word_list, reverse=True) 
    with outputfile as myfileout: 
     writer = csv.writer(myfileout) 
     writer.writerows(sorted(word_list, reverse=True)) 

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

Когда я запускаю этот скрипт в каталоге с 20 текстов в нем, я получаю следующее:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-63-c16fff380b6f> in <module>() 
    17  word_list = [(val, key) for key, val in freq_dic.items()] 
    18  sorted(word_list, reverse=True) 
---> 19  with outputfile as myfileout: 
    20   writer = csv.writer(myfileout) 
    21   writer.writerows(sorted(word_list, reverse=True)) 

ValueError: I/O operation on closed file 
+0

Каков ваш вопрос в точности? Вы можете легко получить список текстовых файлов с помощью 'txt = [i for i в os.listdir ('.'), Если i.endswith ('. Txt')]', а затем применить частотную функцию слова к каждому файлу. Кроме того, вас может заинтересовать ['nltk'] (http://nltk.org/). Он имеет классы для работы с корпорациями (каталог текстовых файлов), легко разбивает файлы на слова и имеет 'FreqDist' для вычисления частот. – ChrisP

+0

Отредактированное сообщение, чтобы включить отчет об ошибке - потому что вы не можете сделать это в комментарии. (И прочитайте это.) –

ответ

1

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

for fpath in glob.glob("*.txt"): 
    frequencies = getFrequencies(fpath) # assume function returns list of (word, freq) pairs 
    outfile = 'output.{0}'.format(fpath) # generate a name for the output file somehow 
    with open(outfile, 'w') as f: 
     wtr = csv.writer(f) 
     wtr.writerows(frequencies) 
     f.close() 

Вы можете создать функцию из существующего кода для обработки расчетов частот:

def getFrequencies(fpath): 
    with open(fpath, 'r') as f: 
     words = re.split('\s+', f.read().lower()) 
     freq_dic = {} 
     punctuation = re.compile(r'[.?!,":;]') 
    for word in words: 
     word = punctuation.sub("", word) 
     try: 
      freq_dic[word] += 1 
     except: 
      freq_dic[word] = 1 
    return [(val, key) for key, val in freq_dic.items()] 

Также посмотрите на collections.Counter для обновления счетчиков.

+0

@ChristP: Если я возьму эти два фрагмента кода и использую их вместе, вывод будет только одним CSV-файлом, и я не могу сказать, какой файл он перешел: это не первый файл в каталоге, и это не весь каталог: количество слов слишком низкое. Возможно, я принял ваш ответ слишком буквально? –

+0

Я получаю, как работает определенная функция: это круто, но я не вижу, как первый блок кода выполняет итерацию через каждый текстовый файл для создания файла cdv для каждого из них. –

+0

Да, вам нужно будет сгенерировать новый файл для каждого входного файла. Я отредактировал свой ответ, чтобы уточнить. Существует несколько способов сделать это. ['os.path.split()'] (http://docs.python.org/2/library/os.path.html) может вас заинтересовать. – ChrisP

Смежные вопросы