繁体   English   中英

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

[英]Python - csv writer write by column, not row

我正在处理一系列文本文件,其中我想保留一些变量。 我试图将这些变量保存在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个单词单词列表,420个单词单词清单2,总共1423个单词。

如果您只想将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*列表(而不是每次在常数时间内找到单词时扫描整个列表),并逐行扫描输入文件以避免破坏内存。

第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)

PS请参阅计数器使用示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM