Python:读取多个文本文件并编写相应的csv文件

时间:2014-01-03 00:11:58

标签: python csv text

我无法在其他地方找到这个问题的答案,所以我将继续发布在这里:

我有一个Python脚本,它将读取文本文件的内容,将其内容拆分为单词,然后输出一个CSV文件,该文件将文本缩减为单词频率列表。 (最后我会插入一行来删除单词,但是我还没有达到那么远。)接下来我要用这个脚本做的是将它指向一个文本文件目录并让它迭代这些文件,为每个TXT文件生成相应的CSV文件。

这是我到目前为止所拥有的:

#! /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))

我希望,我可以告诉我,我只是在工作,而且#34; up"从工作脚本,但我有点失落。我为文件输出中的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

1 个答案:

答案 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以更新计数。