【问题标题】:Counting word occurrences in csv and determine row appearances计算 csv 中的单词出现次数并确定行的出现
【发布时间】:2018-01-02 12:38:04
【问题描述】:

我在一列中有一个 csv 文件,如下所示。符号和数字仅表明该文件不仅包含文本。我有两个目标:

  1. 统计一个单词出现的次数;
  2. 确定单词出现在多少行中。

Stuff
I like apples. Sally likes apples.
Jim has 4 berries.  !@#
John has 2 apples.

理想情况下,代码应返回如下内容: {苹果:3} {行数:2}

我编写了一些代码来尝试计算出现次数,但它运行不正常(可能是因为标点符号)。另外,我不知道如何确定一个单词出现的行数;这可能就像计算每行中唯一出现的次数一样简单,但我不确定如何继续。这是我到目前为止在 Python 3.6.1 中完成的代码:

import csv
my_reader = csv.reader(open('file.csv', encoding = 'utf-8'))
ctr = 0
for record in my_reader:
    if record[0] == 'apples':
        ctr += 1
print(ctr)

代码仅返回 0 作为答案。帮忙?

【问题讨论】:

  • print(record) 在循环中,看看里面放了什么。您可以使用str.find() 方法在字符串中搜索子字符串。或者,您可以使用str,split() 方法将字符串分成单独的“单词”,并使用空格(' ')作为分隔符。
  • print(record) 将文件的最后一行返回为['John has 2 apples.'],即看起来它忽略了其他行。
  • 也许不是。你把print inside 放在循环里了吗?否则,您可能只会显示最后一条记录。
  • 重点是print(record) 输出的是整行,而不是行中的每个单词。因此,您要么需要在每一行中查找子字符串,要么需要拆分每一行并查看单个单词。还有@martineau:我认为你的意思是str.split(' ')str,split 看起来不太正确。
  • @3D1T0R:是的,这是我的一个错字,而且大部分是在我试图表达的观点上。

标签: python python-3.x csv word-count


【解决方案1】:

我不知道你为什么使用 csv 阅读器,因为你没有使用任何 csv 文件。

这里的代码可以用更少的代码完成您需要的工作。

my_reader = open('file.csv', encoding = 'utf-8')
rows = 0
apples = 0

for record in my_reader:
    if record.count('apple') > 0:
        rows += 1
        apples += record.count('apple')

print('{apples: %d } {# of rows: %d }' % (apples, rows))

下面是运行的代码: https://repl.it/JkVn/1

【讨论】:

  • 我正在阅读一个 csv 文件,所以不确定你的意思。另外,如果我将文件打开行中的参数'r' 更改为encoding = 'utf-8',它会运行,谢谢您的输入;使用'r',shell 返回一个 unicodedecode 错误。
  • 您与我们共享的文件只是一个带有 csv 扩展名的简单 txt 文件。 csv 文件是一个电子表格文件,这里是维基百科页面,显示了它的格式en.wikipedia.org/wiki/Comma-separated_values
  • 是的,我知道 csv 文件是什么,但不知道如何在不截屏的情况下粘贴文件,所以我只是手动输入了 csv 文件中的条目。您的代码可以在小修改后使用,所以不用担心。
【解决方案2】:
import collections
import csv

occurrences = collections.defaultdict(lambda: collections.Counter())
with open('path/to/file') as infile:
    for r,row in enumerate(csv.reader(infile)):
        r = (r,)
        for word in (w for col in row for w in col.split()):
            occurrences[word].update(r)

for word,occs in occurrences.items():
    print("{} appears {} times on {} rows".format(word, sum(occs.values()), len(occs)))

【讨论】:

  • occurrences = collections.defaultdict(collections.Counter) 也有效——开销更少。
  • @inspectorG4dget,我也尝试了您的解决方案,但出现enumerate 的“无效语法”错误。如果这很重要,我正在使用 OS X...
  • @Mat: 应该是for r,row in enumerate(csv.reader(infile)):
【解决方案3】:

您正在比较row == 'apple,您需要的是if 'apple' in row。要计算出现次数,您可以使用str.count(),例如:

import csv
my_reader = csv.reader(open('file.csv', encoding = 'utf-8'))
ctr = 0
rows = 0
for record in my_reader:
    if 'apples' in record[0]:
        rows += 1
        ctr += record[0].count('apples')

print('apples: {}, rows: {}'.format(ctr, rows))

这样您将检查row 是否包含apples,然后将rows 增加1,并在row 中将ctr 增加apples 的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-09
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    相关资源
    最近更新 更多