Python 尝试将带有边的txt.file转换为edgelist
我有一个txt-此格式的文件: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')
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:已更新。