我一直在解决从txt文件中提取读取/操作/提取数据的麻烦。在文本文件中,它有一个包含各种信息的通用标题,下面就像这样设置:
~ECOLOGY
~LOCATION
LAT: 59
LONG: 23
~PARAMETERS
Area. 8
Distribution. 3
Diversity. 5
~DATA X Y CONF DECID PEREN
3 6 1 3 0
7 2 4 2 1
4 8 0 6 2
9 9 6 2 0
2 3 2 5 4
6 5 0 2 7
7 1 2 4 2
我希望能够提取列的标题并使用列的标题作为索引或键,因为有时列数据的类型可以在文件之间更改,并且数据行的数量也会波动。我希望能够读取每列中的数据,以便在位置上待处理我可以对如下所示的列进行求和或添加,并将其作为单独的文件导出:
~DATA X Y CONF DECID PEREN TOTAL
3 6 1 3 0 4
7 2 4 2 1 7
4 8 0 6 2 8
9 9 6 2 0 8
2 3 2 5 4 11
6 5 0 2 7 9
7 1 2 4 2 8
有什么建议吗?
这是我到目前为止所做的:
E = open("ECOLOGY.txt", "r")
with open(path) as E:
for i, line in enumerate(E):
sep_lines = line.rsplit()
if "~DATA" in sep_lines:
key =(line.rsplit())
key.remove('~DATA')
for j, value in enumerate(key):
print (j,value)
print (key)
dict = {L: v for v, L in enumerate(key)}
print(dict)
答案 0 :(得分:0)
如果你学会了大熊猫的生活,你的生活会更容易。但你可以不用。
with open('ttl.txt') as ttl:
for _ in range(10):
next(ttl)
first = True
for line in ttl:
line = line.rstrip()
if first:
first = False
labels = line.split()+['TOTAL']
fmt = 7*'{:<9s}'
print (fmt.format(*labels))
else:
numbers = [int(_) for _ in line.split()]
total = sum(numbers[-3:])
other_items = numbers + [total]
fmt = 6*'{:<9d}'
fmt = '{:<9s}'+fmt
print (fmt.format('', *other_items))
~DATA X Y CONF DECID PEREN TOTAL 3 6 1 3 0 4 7 2 4 2 1 7 4 8 0 6 2 8 9 9 6 2 0 8 2 3 2 5 4 11 6 5 0 2 7 9 7 1 2 4 2 8
next
会跳过输入文件中的行。您可以使用split()
在空格上拆分输入行,使用格式将项目重新组合在一起。
答案 1 :(得分:0)
这是一种非常基本的,虚弱的格式依赖解决方案。但我希望它可以帮到你。
with open("test.txt") as f:
data_part_reached = False
for line in f:
if "~DATA" in line:
column = [[elem] for elem in line.split(" ") if elem not in (" ", "", "\n", "~DATA")]
data_part_reached = True
elif data_part_reached:
values = [int(elem) for elem in line.split(" ") if elem not in (" ", "", "\n")]
for i in range(len(columns)):
columns[i].append(values[i])
columns =
[['X', 3, 7, 4, 9, 2, 6, 7],
['Y', 6, 2, 8, 9, 3, 5, 1],
['CONF', 1, 4, 0, 6, 2, 0, 2],
['DECID', 3, 2, 6, 2, 5, 2, 4],
['PEREN', 0, 1, 2, 0, 4, 7, 2],
['TOTAL', 4, 7, 8, 8, 11, 9, 8]]
这将为您提供列表列表,其中每个列表的第一个元素是标题,其余的是值。我将值转换为int
,因为您说要与它们一起操作。您可以将此列表转换为dict,其中key
是标题,如果需要,每列的值列表为value
,如下所示。
d = {}
for column in columns:
d[column.pop(0)] = column
d =
{'DECID': [3, 2, 6, 2, 5, 2, 4],
'PEREN': [0, 1, 2, 0, 4, 7, 2],
'CONF': [1, 4, 0, 6, 2, 0, 2],
'X': [3, 7, 4, 9, 2, 6, 7],
'TOTAL': [4, 7, 8, 8, 11, 9, 8],
'Y': [6, 2, 8, 9, 3, 5, 1]}
答案 2 :(得分:0)
创建一个空字典来存储所有需要的数据。
从文件对象中读取E
并循环,直到到达以~DATA
开头的行。
然后拆分标题项,追加TOTAL
然后从循环中断。
创建一个列表来存储剩余的数据。
循环以分割数据,然后追加总和。
该列表将附加每个数据列表。
循环结束,然后将列表添加到字典中。
dic = {}
with open("ECOLOGY.txt") as E:
for line in E:
if line[:5] == '~DATA':
dic['header'] = line.split()[1:] + ['TOTAL']
break
data = []
for line in E:
cols = line.split()
cols.append(sum([int(num) for num in cols[2:]]))
data.append(cols)
dic['data'] = data
字典将是{&#39;标题&#39;:[...],&#39;数据&#39;:[[...],...]}
编辑:在代码开头添加了缺失的dic声明。