从python中的文本文件中读取特定列

Jet*_*hro 17 python list text-files

我有一个文本文件,其中包含一个由数字组成的表,例如:

5 10 6

6 20 1

7 30 4

8 40 3

9 23 1

4 13 6

例如,如果我想要仅包含在第二列中的数字,我如何将该列提取到列表中?

For*_*Bru 24

f=open(file,"r")
lines=f.readlines()
result=[]
for x in lines:
    result.append(x.split(' ')[1])
f.close()
Run Code Online (Sandbox Code Playgroud)

您可以使用列表推导来完成相同的操作

print [x.split(' ')[1] for x in open(file).readlines()]
Run Code Online (Sandbox Code Playgroud)

文档 split()

string.split(s[, sep[, maxsplit]])

返回字符串的单词列表s.如果可选的第二个参数sep不存在或为None,则单词由空格字符的任意字符串(空格,制表符,换行符,返回值,换页符)分隔.如果存在第二个参数sep而不是None,则它指定要用作单词分隔符的字符串.然后,返回的列表将比字符串中分隔符的非重叠出现次数多一个项目.

所以,你可以省略我使用过的空间,x.split()但这也会删除标签和换行符,请注意这一点.

  • http://stupidpythonideas.blogspot.com/2013/06/readlines-considered-silly.html (3认同)
  • @StefanPochmann,他们正在那里处理大文件.这里仅用于清晰.老实说,我不相信一个名为_stupid_pythonideas的网站:) (2认同)
  • *不是*仅关于大文件。当然,您的`x`非常清楚。 (2认同)

Ada*_*ith 8

您有一个以空格分隔的文件,因此请使用专为读取分隔值文件而设计的模块csv.

import csv

with open('path/to/file.txt') as inf:
    reader = csv.reader(inf, delimiter=" ")
    second_col = list(zip(*reader))[1]
    # In Python2, you can omit the `list(...)` cast
Run Code Online (Sandbox Code Playgroud)

zip(*iterable)模式可用于将行转换为列,反之亦然.如果你正在逐行阅读文件......

>>> testdata = [[1, 2, 3],
                [4, 5, 6],
                [7, 8, 9]]

>>> for line in testdata:
...     print(line)

[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
Run Code Online (Sandbox Code Playgroud)

...但需要列,您可以将每一行传递给该zip函数

>>> testdata_columns = zip(*testdata)
# this is equivalent to zip([1,2,3], [4,5,6], [7,8,9])

>>> for line in testdata_columns:
...     print(line)

[1, 4, 7]
[2, 5, 8]
[3, 6, 9]
Run Code Online (Sandbox Code Playgroud)


aer*_*mat 6

我知道这是一个老问题,但是没有人提到当您的数据看起来像一个数组时,numpy的loadtxt会派上用场:

>>> import numpy as np
>>> np.loadtxt("myfile.txt")[:, 1]
array([10., 20., 30., 40., 23., 13.])
Run Code Online (Sandbox Code Playgroud)


Kas*_*mvd 5

您可以使用zip具有列表理解的函数:

with open('ex.txt') as f:
    print zip(*[line.split() for line in f])[1]
Run Code Online (Sandbox Code Playgroud)

结果 :

('10', '20', '30', '40', '23', '13')
Run Code Online (Sandbox Code Playgroud)