我的文本文件如下所示。我想在第8行的第一列中写入值,即使用python中的函数将226写入变量。有人可以帮忙吗?
## net.sf.picard.metrics.StringHeader
# net.sf.picard.analysis.CollectInsertSizeMetrics
## net.sf.picard.metrics.StringHeader
# Started on: Mon Sep 16 22:48:21 EEST 2013
## METRICS CLASS net.sf.picard.analysis.InsertSizeMetrics
MEDIAN_INSERT_SIZE MEDIAN_ABSOLUTE_DEVIATION MIN_INSERT_SIZE MAX_INSERT_SIZE
226 41 2 121947929 235.101052 64.322693 43832988
FR 17 33 49 65 83 103 127 155 205 397
答案 0 :(得分:1)
您的文件不是一个CSV / TSV文件,因此使用csv
模块可能最终会像在这种情况下手动解析一样棘手。所以,让我们这样做:
with open(filename) as f:
for i, row in enumerate(f):
if i == 7: # 8th row
columns = row.split()
value = columns[0] # 1st column
break
这样做的好处是我们只读取和解析前8行而不是整个文件。
如果你理解了iterables,我发现(完全相同的事情)这个更简单:
with open(filename) as f:
value = more_itertools.nth(f, 7).split()[0]
为简单起见,我使用了第三方more-itertools
模块。如果您不想安装它,nth
在标准库itertools
模块的文档中的配方中定义,因此您可以像任何其他配方一样复制和粘贴它:
def nth(iterable, n, default=None):
"Returns the nth item or a default value"
return next(itertools.islice(iterable, n, None), default)
或者您可以将其内联到一个更复杂的表达式中:
with open(filename) as f:
value = next(itertools.islice(f, 7, None)).split()[0]
(就个人而言,我发现它的可读性稍差;它就像是说“从#7到结尾的所有行的第一行”,而不只是说“第7行”。但有些人不喜欢定义了许多琐碎的功能。)
我可能将其作为一个函数包装(仅return …
而不是value = …
和break
,具体取决于您使用的版本):
def get_row_col(filename, row, col):
with open(filename) as f:
return more_itertools.nth(f, row).split()[col]
value = get_row_col(filename, 7, 0)
在不读取整个文件的情况下从文件中获取第7行的另一种方法是使用linecache
模块:
def get_row_col(filename, row, col):
row = linecache.getline(filename, 7)
return row.split()[col]
如果您在很多不同的时间调用相同文件名的许多不同行,这将会更有效率。