如何使用Python读取文本文件中的数字?

9

我是初学者,正在学习Python编程,我正在通过编写简单的程序来学习Python。这是我想做的事情:如果我有一个包含数字的文本文件,比如说f1.txt:

f1.txt:

1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 15


fp = open('f1.txt')
a1=[]
a2=[]
a3=[]
a4=[]
lines = fp.readlines()

for ln in lines[0:len(lines)]:
line=ln.strip().split()
a1=line();

fp.close()

我希望能够在a1中获取第一列,在a2中获取第二列,以此类推。我知道上述代码可能有误,请告诉我出了什么问题,并指导我如何纠正。尤其是我不理解'ln.strip().split()'的命令。有人能帮忙吗?


请使用正确的缩进,否则程序将无法运行。 - dornhege
如果你把问题限制在一个方面,那么你会得到更好的回答。你可以尝试运行你的代码,并具体询问任何错误信息或者为什么输出与你预期的不同。 - pjmorse
4个回答

18

您可以这样做:

a1 = []
a2 = []
a3 = []
a4 = []

with open('f1.txt') as f:
    for line in f:
        data = line.split()
        a1.append(int(data[0]))
        a2.append(int(data[1]))
        a3.append(int(data[2]))
        a4.append(int(data[3]))

首先,我们使用 with 语句打开文件。这将确保即使出现错误,文件也会自动关闭。这样做更好。在文件打开时,f 将是文件句柄。
现在,Python 允许我们通过对文件句柄进行迭代来迭代文件的所有行。因此,for line in f 将自动迭代所有行。没有必要首先调用 readlines(),当然也不需要执行 lines[0:len(lines)],这本质上只创建列表的副本 - 您也可以遍历 lines
现在,在循环内部,我们获取该行,并按空格拆分它 - 如果没有参数,则str.split 总是这样做。 str.split 返回一个列表,因此我们将其存储在一个额外变量中。接下来,我们将每个列附加到正确的列表中。由于您希望将值作为数字获取,因此我们将它们转换为整数。
你提到的 str.strip 基本上将删除字符串的任何前导或尾随空格。由于我们正在使用没有参数的 str.split,因此额外的空格也将被删除,因此我们不需要它。
最后,维护四个单独变量中的四个单独列表有点麻烦。您可以简单地创建一个列表的列表:
a = [[], [], [], []] # A list with four empty lists

接着,在循环内部,您可以将 data[i] 直接附加到 a[i] 中:

for i, value in enumerate(line.split()):
    a[i].append(int(value))

当使用 enumerate 进行迭代时,不仅可以获取值(如果只对列表进行迭代也可以获取到),还可以获取索引。因此,我们可以使用这个索引获取拆分后每个元素的索引,并自动将其附加到a的正确子列表中。

好的,这四行附加代码不太好。我会向他展示如何使用循环来实现。此外,他需要数字,所以让我们提到 int() - georg
@thg435 谢谢你的建议 ;) - poke

3
data = []
for line in lines:
    data.append([int(v) for v in line.split()])

或者
data = [[int(v) for v in line.split()] for line in lines]

编辑: 回答评论 - 下面的代码将重新排列数据为所需的数字列表

numbers = zip(*data)

这将生成一行的列表,而不是一列的列表。 - poke
@poke,任务完成 :) - volcano

1

line[0],line[1]等应该给出每行的第一个、第二个等条目。

split()函数将在空格处拆分给定的行,并返回条目列表。


0

你的 for 循环缩进有误。所有你想要包含在循环中的代码都应该缩进 4 个空格。

a1= line() 不会做任何事情。语法 a = A() 将把 a 设置为函数 A() 的结果或类 A 的新实例。如果你想将 line 添加到列表 a1 中,你需要使用 a1.append(line)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接