如何从文件中解压值
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 解析器)。
如果作为输入我有一个读取的文件-
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 解析器)。