[英]How do I load specific rows from a .txt file in Python?
假设我有一个 .txt 文件,其中包含多行和多列数据以及一个包含整数值的列表。 我将如何加载文本文件中与列表中的整数匹配的行号?
为了说明,假设我有一个整数列表:
a = [1,3,5]
我如何将文本文件中的第 1,3 和 5 行读入数组?
numpy 中的 loadtxt 例程让您既可以跳过行,也可以使用特定的列。 但我似乎无法找到一种方法来做一些事情(忽略不正确的语法):
new_array = np.loadtxt('data.txt', userows=a, unpack='true')
谢谢你。
鉴于此文件:
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]]
只是为了扩展我的评论
$ 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
您可以坚持使用 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')
使用CSV module
和Files.xreadlines()
。
CSV module
:实现类以读取和写入 CSV 格式的表格数据
Files.xreadlines()
:返回字典键上的迭代器。 这是 iterkeys() 的快捷方式。 2.3 版后已弃用:改为for line in file
。
我建议使用line.split ()
而不是line.strip()
。 line.split ()
返回列表,可以使用np.asarray
命令轻松将其转换为numpy.array
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.