计数;生成tsv文件

0 投票
3 回答
1503 浏览
提问于 2025-04-18 01:02

我想计算一个tsv文件中路径的平均长度。路径中的各个部分是用“;”分开的。

这个tsv文件的格式是这样的:

格式: [哈希后的IP地址] [时间戳] [持续时间(秒)] [路径] [评分]

  6a3701d319fc3754  1297740409  166 14th_century;15th_century;16th_century;Pacific_Ocean;Atlantic_Ocean;Accra;Africa;Atlantic_slave_trade;African_slave_trade   NULL
  3824310e536af032  1344753412  88  14th_century;Europe;Africa;Atlantic_slave_trade;African_slave_trade 3
  415612e93584d30e  1349298640  138 14th_century;Niger;Nigeria;British_Empire;Slavery;Africa;Atlantic_slave_trade;African_slave_trade   NULL

我到目前为止写的代码是:

 import csv
 count=0
 with open('paths_finished.tsv', 'rb') as tsvfile:
     a = csv.reader(tsvfile,dialect='excel-tab')
     for row in a:
     # if row[3:4] == ';':
       # count++
         print row[1:4]

我该怎么计算文件中的“;”数量呢?

3 个回答

1

你可以使用 split 方法:

paths = row[3].split(";")
print len(paths) - 1

这个方法会计算这一行中有多少个 ; 字符。如果你想计算被 ; 分开的元素数量,可以去掉 -1 的部分。

1

我建议用 ; 作为分隔符,如果你只是想计算分号的数量,可以用 len(row) - 1

也就是说:

with open('paths_finished.tsv', 'rb') as tsvfile:
     a = csv.reader(tsvfile,dialect='excel-tab',delimiter=';')
     for row in a:
         print len(row)-1 # subtract 1 for counting ';'
2

使用 索引,而不是切片,来获取单独的一列:

for row in a:
    article_count = len(row[3].split(';'))

把特定列的文本用 ';' 分开,就能得到一个元素列表;用 len() 可以告诉你有多少个元素。

另外,你也可以数一下 ; 字符的数量,然后加一:

for row in a:
    article_count = row[3].count(';') + 1

不过,也许你还想对路径元素本身做点什么。

要计算所有路径的平均长度,我只需要用 .count()

total = 0
count = 0

for row in a:
    total += row[3].count(';') + 1
    count += 1

average = total / float(count)

在这种情况下,你甚至不需要使用 csv 模块;你根本不需要把行分成行,因为其他列里没有 ; 分号,所以更简单的办法就是直接遍历文件的每一行:

with open('paths_finished.tsv', 'rb') as tsvfile:
    total = 0
    count = 0

    for line in tsvfile:
        total += line.count(';') + 1
        count += 1

    average = total / float(count)

撰写回答