Python读取.txt文件头

Python读取.txt文件头,python,file,numpy,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,

我需要从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文件的答案。

这应该有用

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')
将每行拆分为字段名和字段值,然后只需检查字段名是否是您关心的字段,如果是,则使用值,而不是使用
startswith
然后对结果字符串进行切片以获得其结尾。

我将使用
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\u line
的值,以获得总高度。文件中的所有数据都将保存在变量
data

中,这样就可以了,但有一点需要注意:

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个空格,但是
角距离
后面只有1个空格,因此键结束和值开始的位置不明确(除了人脑自己复杂的上下文解析器)

可能问题在于(在这个页面上,或者在复制粘贴到SO的过程中)实际应该是选项卡的呈现不好。如果是,

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

这将解决问题。但如果没有,则需要先解决文件格式中的歧义,然后才能编写最终解决方案。

如果头文件中的键始终相同,则可以使用
re
模块执行此操作:

file = open(filename, 'r')
data = file.read()
Total = re.findall( 'Total Height\s*([0-9]+)\s*\n', data)[0]

我有同样的任务来读取头文件,并使用
re
module

得到:
ValueError:需要超过1个值来解包
听起来好像它试图在一个字符(例如,
'\t'
)上拆分一行,而该字符没有出现在该行中。我只是猜测有人在使用
\t
。正如我所说,在继续之前,您必须解决文件格式的问题:区分键和值的规则是什么?我的答案中的代码必须根据该问题的答案进行调整,这无法从您的示例中确定。我如何解析它,如何从
数据中获取
N
depth
?我添加了
height=height\u line.split('\t')[1]
,这很好地解决了我的问题。我还添加了一些带有
height\u line.find('\t')
math.isnan
panda.isnull()
的过滤器,它还捕获nan和空条目。但这不限制它将数字作为条目吗?我也有字母条目。@brium-brium您可以将
([0-9]+)
替换为
(.+?)
,它将在空格后和换行前找到任何字符。我只有一个问题,一些文件有一个
NaN
条目,甚至是一个空条目。有没有办法过滤它?你可以把值=。。。try/except块中的行,这样,如果它试图解析非数字的内容,except块将捕获异常并将值设置为None。然后,在for循环完成后,可以检查值是否等于None。如果没有,则执行常规操作,如果是这样,则不执行任何操作,或者添加一些逻辑,说明如果文件没有指定好的总高度,将发生什么。此外,如果这个答案回答了您的问题,您介意投票并将其标记为正确吗?:)标题中的条目由
\t
分隔符分隔。所以我可以用它作为分割字符串的安全方法。