Как распаковать значения из файла - PullRequest
1 голос
/ 08 июля 2020

Если в качестве входа у меня есть файл, который читает-

0->54:15
1->41:12
2->35:6
3->42:10
4->34:7
5->58:5
6->55:12
7->39:6
8->36:12
9->38:15
10->53:13
11->56:12
12->51:5
13->48:8
14->60:14
15->46:12
16->57:6
17->52:9
18->40:11

На самом деле это список смежности. Я хочу, чтобы мой код читал файл и принимал значения как -> u = 0, v = 54, w = 15, а затем go с моим планом. Как я могу это сделать? Заранее благодарим вас за то, что вы уделили время, чтобы прочитать это и ответить.

Ответы [ 4 ]

3 голосов
/ 08 июля 2020

Было бы хорошо использовать .split. Для каждой строки в файле (вы можете получить это с помощью функции open()) разделите ее с помощью стрелки и двоеточия.

for line in lines:
    split_line = line.split("->") # Split by the arrow first
    split_line = split_line[0] + split_line[1].split(":")
    u, v, w = split_line # Note u, v, and w are strings

Я бы рекомендовал использовать формат JSON, чтобы вы могли использовать Модуль json в python позволяет легко разобрать файл на переменные.

1 голос
/ 08 июля 2020

Я собираюсь оспорить способ получения входного файла в первую очередь: если у вас есть какой-либо контроль над тем, как вы получаете этот входной файл, я бы посоветовал вам изменить его формат. (Если нет, возможно, этот ответ поможет людям, у которых в будущем возникнет аналогичная проблема). большинство современных языков уже имеют для этого встроенные библиотеки. Скорее, если это вообще возможно, вам следует использовать стандартный механизм сериализации и десериализации, такой как Python pickle или JSON сериализатор (или даже CSV, чтобы вы могли использовать парсер CSV) *. 1005 *

1 голос
/ 08 июля 2020

Вот как вы можете использовать re.split() для разделения строк с несколькими разделителями:

from re import split

with open('file.txt','r') as f:
    l = f.read().splitlines()

lst = [list(filter(None, split('[(\-\>):]',s))) for s in l]

print(lst)

Вывод:

[['0', '54', '15'],
 ['1', '41', '12'],
 ['2', '35', '6'],
 ['3', '42', '10'],
 ['4', '34', '7'],
 ['5', '58', '5'],
 ['6', '55', '12'],
 ['7', '39', '6'],
 ['8', '36', '12'],
 ['9', '38', '15'],
 ['10', '53', '13'],
 ['11', '56', '12'],
 ['12', '51', '5'],
 ['13', '48', '8'],
 ['14', '60', '14'],
 ['15', '46', '12'],
 ['16', '57', '6'],
 ['17', '52', '9'],
 ['18', '40', '11']]

Разбивка:

Это: lst = [list(filter(None, split('[(\-\>):]',s))) for s in l] эквивалент:

lst = [] # The main list
for s in l: # For every line in the list of lines
    uvw = split('[(\-\>):]',s) # uvw = a list of the numbers
    uvw = list(filter(None,uvw)) # There is an empty string in the list, so filter it out
    lst.append(uvw) # Add the list to the main list
1 голос
/ 08 июля 2020

Если у вас была одна строка:

import re

s = \
'''0->54:15
1->41:12
2->35:6
3->42:10
4->34:7
5->58:5
6->55:12
7->39:6
8->36:12
9->38:15
10->53:13
11->56:12
12->51:5
13->48:8
14->60:14
15->46:12
16->57:6
17->52:9
18->40:11'''

s = s.split('\n')
output = [re.split('->|:', x) for x in s]

вывод

[['0', '54', '15'], ['1', '41', '12'], ['2', '35', '6'], ['3', '42', '10'], ['4', '34', '7'], ['5', '58', '5'], ['6', '55', '12'], ['7', '39', '6'], ['8', '36', '12'], ['9', '38', '15'], ['10', '53', '13'], ['11', '56', '12'], ['12', '51', '5'], ['13', '48', '8'], ['14', '60', '14'], ['15', '46', '12'], ['16', '57', '6'], ['17', '52', '9'], ['18', '40', '11']]

Если вам нужен словарь

d = {x[0]:[x[1],x[2]] for x in output}

d

{'0': ['54', '15'], '1': ['41', '12'], '2': ['35', '6'], '3': ['42', '10'], '4': ['34', '7'], '5': ['58', '5'], '6': ['55', '12'], '7': ['39', '6'], '8': ['36', '12'], '9': ['38', '15'], '10': ['53', '13'], '11': ['56', '12'], '12': ['51', '5'], '13': ['48', '8'], '14': ['60', '14'], '15': ['46', '12'], '16': ['57', '6'], '17': ['52', '9'], '18': ['40', '11']}

Если вам нужен фрейм данных:

import pandas as pd
df = pd.DataFrame(output, columns=['u','v','w'])

df

     u   v   w
0    0  54  15
1    1  41  12
2    2  35   6
3    3  42  10
4    4  34   7
5    5  58   5
6    6  55  12
7    7  39   6
8    8  36  12
9    9  38  15
10  10  53  13
11  11  56  12
12  12  51   5
13  13  48   8
14  14  60  14
15  15  46  12
16  16  57   6
17  17  52   9
18  18  40  11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...