尝试将带边的txt.file转换为edgelist

时间:2018-05-22 18:14:12

标签: python type-conversion networkx

我有一个txt。 -file是这种格式:

0   61
0   33344
0   33412
0   36114
0   37320
0   37769
0   37924

这实际上是一个网络边缘列表,我想将其转换为以下

elist = [(0,61), (0,33344), (0,33412), (0,36114), (0,37320), (0,37769), (0,37924)]

我的想法如下:

import csv

data = open("path_to_file.txt", 'r')
reader = csv.reader(data)
allRows = [tuple(row) for row in reader]

问题是我收到了这个:

[('0\t61',), ('0\t33344',), ('0\t33412',), ('0\t36114',), ('0\t37320',), ('0\t37769',), ('0\t37924',)]

我们如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

import csv

data = open("path_to_file.txt", 'r')
reader = csv.reader(data)
allRows = [tuple(row.split('\t')) for row in reader]

你很亲密。如果你宁愿走这条路线,几乎可以肯定另一种方法是让csv拆分标签而不是逗号。

编辑:正如@roganjosh所说,你可以做到

import csv

data = open("path_to_file.txt", 'r')
reader = csv.reader(data, delimiter='\t'))
allRows = [tuple(row) for row in reader]

答案 1 :(得分:1)

其他海报提到你可以使用转义码\t作为csv.reader()中的分隔符来解析额外的行。这是事实,但从您的文件中可以看出,您的分隔符实际上是四个空格而不是一个制表符。所以,这不起作用。

如果您打印[row for row in reader],您会发现相邻元素之间的分隔未被保留:

 [['0   61'],
 ['0   33344'],
 ['0   33412'],
 ['0   36114'],
 ['0   37320'],
 ['0   37769'],
 ['0   37924']]

因此,将此转换为元组的努力将失败,因为每行只有一个str元素。那么,row中的每个reader都是一个元素list。致电row[0]会为您提供实际的字符串值:'0 61'

然后我们使用.split()从此字符串创建两个元素:

In [47]: '0   61'.split()
Out[47]: ['0', '61']

现在,我们可以使用map从这两个新字符串创建整数:

In [49]: map(int,'0   61'.split())
Out[49]: [0, 61]

然后,我们转换为元组并附加到列表,就像您上面所做的那样,我们有一个可行的解决方案。

data = open("path_to_file.txt", 'r')
reader = csv.reader(data)
allRows = [tuple(map(int,row[0].split())) for row in reader]

In [43]: allRows
Out[43]:
[(0, 61),
 (0, 33344),
 (0, 33412),
 (0, 36114),
 (0, 37320),
 (0, 37769),
 (0, 37924)]