如何使用python从文本文件中提取数据

时间:2017-12-12 20:51:23

标签: python-3.x

我一直在解决从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)  

3 个答案:

答案 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声明。