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

Python 尝试将带有边的txt.file转换为edgelist,python,type-conversion,networkx,Python,Type Conversion,Networkx,我有一个txt-此格式的文件: 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')

我有一个txt-此格式的文件:

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',)]
我们如何解决这个问题

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]

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

如果打印出
[读卡器中的行对行]
,您会发现相邻元素之间的间隔未被保留:

 [['0   61'],
 ['0   33344'],
 ['0   33412'],
 ['0   36114'],
 ['0   37320'],
 ['0   37769'],
 ['0   37924']]
因此,将其转换为元组的努力将失败,因为每行只有一个
str
元素。因此,
读取器
中的每个
都是一个元素
列表
。调用
行[0]
将给出实际的字符串值:
'061'

然后,我们使用
.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)]

您需要将分隔符指定为制表符而不是逗号
csv.reader(data,delimiter='\t')
您应该真正展示在读取器中指定此项的方法,而不是展示如何用另一次完整传递所有数据来修复损坏的输出。请尝试发布不仅仅是代码。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。@Martin:已更新。