Python - csv编写器按列写,而不是行

时间:2015-02-23 13:48:54

标签: python csv

我正在处理一系列文本文件,其中我想保留一些变量。我试图将这些变量保存在csv文件中。每个文本文件将从此csv文件中获取1行和N列。我可能有1000个或更多文件,这将导致csv文件具有1000行和N列(N可以是10或更多或更少)。我正在尝试使用以下代码

res=[variable1, variable2, variable3, ..., variableN]
csvfile = "summary.csv"
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerows(res)

问题是它在每一行写入一个值,然后移动到下一个变量的下一行..而我希望每个文本文件的所有变量占用1行(和N列)。我应该如何更改代码才能使其正常工作?

编辑

import re
import collections
from collections import Counter
import csv
import sys


wanted1 = re.findall('\w+', open('words1.csv').read().lower())
wanted2 = re.findall('\w+', open('words2.csv').read().lower())
for f in sys.argv[1:]:
    words = re.findall('\w+', open('f').read().lower())
    cnt = Counter()
    cnt1 = 0
    cnt2 = 0
    cntWords = 0
    for word in words:
        cntWords += 1
            if word in wanted1:
                cnt[word] += 1
                cnt1 += 1
            if word in wanted2:
                cnt[word] += 1
                cnt2 += 1   
print cnt1, cnt2, cntWords
res=[cnt1, cnt2, cntWords]
csvfile = "summary.csv"
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    writer.writerow(res)

在这种情况下,这些变量中的每一个都是一个数字。我还想添加一些包含字符串内容的变量。每个文本文件将占用1行。每个变量将占用一个单元格。

例如cnt1可以具有值10000,cnt2可以具有值2000,cntWords可以具有值30000等。

我尝试更改代码以处理文件夹中的所有.txt文件,但现在我收到错误

  File "countWords.py", line 29
    writer = csv.writer(output, lineterminator='\n')
                                                   ^
IndentationError: unindent does not match any outer indentation level

编辑2:Output.csv看起来应该是那样

       Column 1 Column 2 Column 3
Row 1: Cnt1     Cnt2     CntWords      (all row 1 values should be derived from file1.txt)
Row 2: Cnt1     Cnt2     CntWords      (all row 2 values should be derived from file2.txt)
Row 3: Cnt1     Cnt2     CntWords      (all row 3 values should be derived from file3.txt)
Row 4: Cnt1     Cnt2     CntWords      (all row 4 values should be derived from file4.txt)
Row 5: Cnt1     Cnt2     CntWords      (all row 5 values should be derived from file5.txt)
Row 6: Cnt1     Cnt2     CntWords      (all row 6 values should be derived from file6.txt)

通过Cnt1我的意思是Cnt1的值,通过Cnt2我的意思是Cnt2的值,通过CntWords我的意思是CntWords的值(这些将是数字)

       Column 1 Column 2 Column 3
Row 1: 5000     3000     10000      (all row 1 values should be derived from file1.txt)
Row 2: 510     420     1423      (all row 2 values should be derived from file2.txt)

这意味着输入是2个文本文件,其中第一个有5000个单词列表1个单词,3000个单词列表单词2个,10000个单词单词,而第二个文本文件有510个单词列表单词1,420个单词列表2的单词,总共1423个单词。

2 个答案:

答案 0 :(得分:2)

如果您只想将3个计数器写入CSV文件,那么只需在循环中写入的CSV文件即可。在循环之外创建CSV编写器,并在处理文件时向其写入行:

find_words = re.compile(r'\w+').findall

# create *sets* for faster membership tests
wanted1 = set(find_words(open('words1.csv').read().lower()))
wanted2 = set(find_words(open('words2.csv').read().lower()))

csvfile = "summary.csv"
with open(csvfile, "wb") as output:
    writer = csv.writer(output)

    for f in sys.argv[1:]:
        cnt1 = cnt2 = cntWords = 0

        with open(f) as inputfile:
            for line in inputfile:
                for word in find_words(line.lower()):
                    cntWords += 1
                    if word in wanted1:
                        cnt1 += 1
                    if word in wanted2:
                        cnt2 += 1   

        writer.writerow([cnt1, cnt2, cntWords])

我还用快速成员资格测试的集合替换了您的wanted*列表(而不是每次在整个列表中扫描整个列表,并且移动到扫描输入文件)逐行避免破坏记忆。

答案 1 :(得分:1)

第18行的缩进错误,它必须看起来像

csvfile = "summary.csv"
with open(csvfile, "w") as output:
    writer = csv.writer(output, lineterminator='\n')
    for f in sys.argv[1:]:
        words = re.findall('\w+', open('f').read().lower())
        cnt1, cnt2 = 0, 0
        cntWords = len(words)
        for word in words:
            if word in wanted1:
                cnt1 += 1
            if word in wanted2:
                cnt2 += 1
        print cnt1, cnt2, cntWords
        res = [cnt1, cnt2, cntWords]
        writer.writerow(res)

P.S。有关计数器使用情况,请参阅example