我是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()'。有人可以帮忙吗?
答案 0 :(得分:17)
你可以这样做:
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.split
返回一个列表,因此我们将其存储在一个额外的变量中。接下来,我们将每列附加到正确的列表。正如您希望将值作为数字,我们将它们转换为整数。
你提到的str.strip
基本上取消了字符串的任何前导或尾随空格。由于我们在没有参数的情况下使用a = [[], [], [], []] # A list with four empty lists
,因此也会删除额外的空格,因此我们并不需要这样做。
最后,将四个单独的列表存储在单独的变量中对维护来说有点烦人。您只需创建一个列表列表:
data[i]
然后,在循环内部,您只需将a[i]
追加到for i, value in enumerate(line.split()):
a[i].append(int(value))
:
a
当迭代enumerate
时,您不仅会获得值(在迭代列表时会得到的值),还会得到索引。因此,使用此方法,我们可以获得分割行中每个元素的索引,并可以自动将其附加到{{1}}的正确子列表中。
答案 1 :(得分: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)
答案 2 :(得分:0)
line[0], line[1]
等应该为您提供每行中的第一个,第二个等条目。
split()
函数将在空白处拆分给定行,并返回条目列表。
答案 3 :(得分:0)
for
循环中的缩进错误。您想要包含在循环中的所有代码都应缩进4个空格。
第a1= line()
行不会做任何事情。语法a = A()
将a
设置为等于函数A()
的结果或等于类A
的新实例。如果您想在列表a1
中添加行,则需要使用a1.append(line)