Python读取.txt文件头

时间:2016-11-17 18:23:59

标签: python file numpy

我需要从txt文件头中读取一些信息,如下所示:

Date    20160122
SP Number   8
Gauge   250N internal
Total Height    61
SP Modell   SP2
Corner Distance 150 

Height  Value   Comment
60  NaN 
...

我目前有一个python程序程序:

depth, N = npy.loadtxt(filename, skiprows=8, unpack=True, usecols = usecols)

但是我想从标题中读出一些值。有没有办法做到这一点?我最感兴趣的是获得“总高度”的值。在我的搜索中,我似乎只能找到有关.csv文件的答案。

4 个答案:

答案 0 :(得分:1)

这应该有效!

field = "Total Height"

# Get first 6 lines
with open(filename) as file:
    lines = [next(file) for x in range(6)]

value = None
for line in lines:
    if line.startswith(field):
        # Get the part of the string after the field name
        end_of_string = line[len(field):]

        # Convert it to an int:
        value = int(end_of_string.strip())

print(value) #Should print 61

如果您知道字段名称和值由制表符而不是空格分隔,则可以使用line.split('\t')将每行分成字段名称和字段值,然后只检查field_name是否为您关心的字段,如果是,请使用该值,而不是使用startswith,然后将生成的字符串切片以获得结束。

答案 1 :(得分:1)

我会使用open而不是npy.loadtxt

with open(filename, 'r') as the_file:
    all_data = [line.strip() for line in the_file.readlines()]
    height_line = all_data[3]
    data = all_data[8:]

然后您可以解析height_line的值,以获得总高度。此文件中的所有数据都将位于变量data

答案 2 :(得分:0)

这样做,但有一点需要注意:

import numpy as npy

usecols = (0, 1)

header = {}
with open(filename, 'rt') as f:
    for header_lines, line in enumerate(f):
        line = line.strip()
        if not line: break # assume that a blank line means "header stops here"
        key, value = line.split(' ', 1)
        header[key] = value


depth, N = npy.loadtxt(filename, skiprows=header_lines + 2, unpack=True, usecols=usecols)

问题在于标题格式对于什么是键和什么是值有歧义。有些键似乎是多个以空格分隔的单词,而某些值也是如此,但是(非确定性的)空白显然是将键与值分开的唯一规则。在大多数情况下,它在键和值之间有3个空格,但Corner Distance后面跟着1个空格 - 因此它是模糊的(除了人类大脑自己的复杂上下文解析器),其中键结束并且值开始。

也许这个问题只是糟糕的渲染(在这个页面上,或在复制粘贴到SO期间)真正应该是标签。如果是的话,

        key, value = line.split('\t', 1)

将解决问题。但如果没有,在编写确定的解决方案之前,需要解决文件格式的歧义。

答案 3 :(得分:0)

如果头文件中的键始终相同,则可以使用file = open(filename, 'r') data = file.read() Total = re.findall( 'Total Height\s*([0-9]+)\s*\n', data)[0] 模块执行此操作:

re

我有同样的任务来读取头文件和did it {{1}}模块