Попытка преобразовать txt.file с краями в edgelist - PullRequest
0 голосов
/ 22 мая 2018

У меня есть текст.-файл этого формата:

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 голосов
/ 22 мая 2018

Другие авторы упоминали, что вы можете просто использовать escape-код \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)]
0 голосов
/ 22 мая 2018
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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...