我有一个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',)]
我们如何解决这个问题?
答案 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
拆分标签而不是逗号。
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)]