如何从文件中解压值

How to unpack values from a file

如果作为输入我有一个读取的文件-

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,然后执行我的计划。我怎样才能做到这一点?预先感谢您花时间阅读和回答此问题。

如果你只有一个字符串:

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

使用 .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 格式,这样您就可以使用 python 中的 json 模块轻松地将文件解析为变量。

以下是如何使用 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

我首先要质疑您获取输入文件的方式:如果您可以控制获取此输入的方式,我鼓励您更改其格式。 (如果没有,也许这个答案会对以后遇到类似问题的人有所帮助)。

通常没有什么理由像这样“自己动手”序列化和反序列化 - 它正在重新发明轮子,因为大多数现代语言已经内置了库来执行此操作。相反,如果可能的话,您应该使用标准的序列化和反序列化机制,如 Python pickle 或 JSON 序列化程序(甚至 CSV,以便您可以使用 CSV 解析器)。