在python中读取文件到变量的值

时间:2013-09-17 19:35:29

标签: python text

我的文本文件如下所示。我想在第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 

1 个答案:

答案 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]

如果您在很多不同的时间调用相同文件名的许多不同行,这将会更有效率。