簡體   English   中英

嘗試將帶邊的txt.file轉換為edgelist

[英]Trying to convert txt.file with edges into edgelist

我有一個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',)]

我們該如何解決這個問題?

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()的分隔符來解析額外的行。 這是事實,但從您的文件中可以看出,您的分隔符實際上是四個空格而不是一個制表符。 所以,這不起作用。

如果打印出[row for row in reader] ,則會發現相鄰元素之間的分隔未被保留:

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

因此,將其轉換為元組的努力將失敗,因為每行只有一個str元素。 那么, reader中的每一row都是單個元素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)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM