6

假设我有一个 .txt 文件,其中包含许多行和列数据以及一个包含整数值的列表。如何在文本文件中加载与列表中的整数匹配的行号?

为了说明,假设我有一个整数列表:

a = [1,3,5]

我如何将文本文件中的第 1,3 行和第 5 行读取到数组中?

numpy 中的 loadtxt 例程让您既可以跳过行也可以使用特定的列。但我似乎无法找到一种方法来做一些事情(忽略不正确的语法):

new_array = np.loadtxt('data.txt', userows=a, unpack='true')

谢谢你。

4

5 回答 5

5

鉴于此文件:

1,2,3
4,5,6
7,8,9
10,11,12
13,14,15
16,17,18
19,20,21

您可以使用 csv 模块来获取所需的 np 数组:

import csv
import numpy as np

desired=[1,3,5]
with open('/tmp/test.csv', 'r') as fin:
    reader=csv.reader(fin)
    result=[[int(s) for s in row] for i,row in enumerate(reader) if i in desired]

print(np.array(result))   

印刷:

[[ 4  5  6]
 [10 11 12]
 [16 17 18]]
于 2013-09-24T23:58:57.680 回答
3

只是为了扩展我的评论

$ cat file.txt
line 0
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
line 9
line 10

Python:

#!/usr/bin/env python

a = [1, 4, 8]

with open('file.txt') as fd:
    for n, line in enumerate(fd):
        if n in a:
            print line.strip()

输出:

$ ./l.py 
line 1
line 4
line 8
于 2013-09-24T21:55:16.690 回答
1

您可以坚持使用 numpy 的loadtxt方法,但您需要将生成器对象传递给函数而不是文件路径。

首先定义一个生成器,它接受文件名和行索引,并且只产生指定索引处的那些行

def generate_specific_rows(filePath, userows=[]):
    with open(filePath) as f:
        for i, line in enumerate(f):
            if i in userows:
                yield line

现在您可以通过创建生成器对象并将其传递给loadtxt方法

a = [1,3,5]
gen = generate_specific_rows('data.txt', userows=a)
new_array = np.loadtxt(gen, unpack='true')
于 2020-04-15T16:36:08.847 回答
0

使用CSV moduleFiles.xreadlines()

  • CSV module: 实现类以 CSV 格式读取和写入表格数据

  • Files.xreadlines():返回字典键的迭代器。这是 iterkeys() 的快捷方式。2.3 版后已弃用:for line in file改为使用。

于 2013-09-24T22:53:41.057 回答
0

我建议使用line.split ()而不是line.strip(). line.split ()返回列表,可以numpy.array使用np.asarray命令轻松转换为。

于 2017-05-26T10:34:39.190 回答