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