计数;生成tsv文件
我想计算一个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)