我有一个文本文件,里面有很多行数据。我需要检查此文本文件的每一行并相应地处理该行中包含的数据(即保存到单独的表格.txt进行分析(
文本文件采用以下格式:
- 数字 1 或 0(表示数据的相关性(
- 每行的 ID(指数据是什么(
- 数据本身(包含在行的其余部分(
因此,这是两个示例行的外观:
1 ID:K-95数据列表
0 ID:D-56其他数据列表
这样,第一行具有与ID K-95相关的数据,第二行具有与ID D-56无关的数据。
我想解析文本文件,并根据相关性(0 或 1(和数据 ID 对每行中包含的数据进行排序,即按相关性顺序使用相同的 ID 保存每一行(首先是所有行 1,然后是 0(。行可以具有相同的 ID,但数据不同。线条也始终是固定长度的。
为此,我想出了:
idtag = input('Enter ID:')
with open("example.txt", 'r') as f:
for line in f.readlines():
if line.startswith('1') and line.startswith(idtag, 5, 3):
print line
但是,对此有麻烦。具体到和运算符之后的第二个条件。我可以根据是否有 0 或 1 打印/选择行,没问题。但是,使用具有定义位置的.startswith()
方法似乎什么都不返回:没有错误,没有打印 - 它只是执行并且不返回任何内容。
有什么想法吗?也许解析这些数据以满足我的目标的更好方法?
start
和end
被解释为绝对位置(特别是:end
不是相对于start
解释str.startswith
的
str.startswith(prefix[, start[, end]])
如果字符串以前缀开头,则返回
True
,否则返回False
。前缀也可以是要查找的前缀元组。使用可选的开始,测试字符串从该位置开始。使用可选结尾,停止比较该位置的字符串。
所以而不是
line.startswith(idtag, 5, 3)
你需要使用
line.startswith(idtag, 5, 5+4)
这两个参数等效于切片表示法:
line[5: 5+4].startswith(idtag)
例如:
>>> a = 'abcdefg'
>>> a.startswith('c', 2, 1)
False
>>> a[2:1]
''
>>> a.startswith('c', 2)
True
>>> a[2:]
'cdefg'
>>> a.startswith('c', 2, 3)
True
>>> a[2:3]
'c'
我意识到已经有一个答案,但作为替代方案,您也可以检查该行中是否存在 idtag:
idtag = input('Enter ID:')
with open("example.txt", 'r') as f:
for line in f.readlines():
if line.startswith('1') and idtag in line:
print line