创建一个列表,其中包含文件的每一行。

41
我试图打开一个文件并创建一个列表,其中包含从文件中读取的每一行。
   i=0
   List=[""]
   for Line in inFile:
      List[i]=Line.split(",")
      i+=1
   print List

但是这份示例代码给了我一个错误,因为i+=1导致索引超出范围的错误。 我的问题是什么?我怎样才能编写代码,以便在InFile的每一行中都增加我的列表呢?

9个回答

98

这很简单:

List = open("filename.txt").readlines()

这将返回文件中每一行的列表。


太好了!完美无瑕!顺便说一下,想象一下那不是一个文件...但我想创建一个动态列表...我该怎么添加元素呢?就像ArrayList一样?非常感谢。 - UcanDoIt
append方法就可以解决问题。例如:xs.append(line) - Eli Courtwright
4
关闭文件怎么样? - matlabit
5
不需要关闭它,Python会在文件超出作用域时自动处理。 - Brian C. Lane
5
有没有办法从生成的列表中去除 "/n"? - Udit Hari Vashisht
这是旧代码,对吧?它不允许我使用 with open - oldboy

69

我是这样做的

lines_list = open('file.txt').read().splitlines()

每一行都带有它的结束符(\n\r);这样字符就被移除了。


4
谢谢,这符合我对被接受答案的期望,去除了换行符 :) 给你点赞+1。 - Stan Smulders

11
my_list = [line.split(',') for line in open("filename.txt")]

2
我担心对于那些仍在尝试理解基本Python的人来说,直接使用列表推导式可能会是一个太大的跨越 :) - Dustin
达斯汀是正确的,然而Orip提供了最正确的答案回答了这个问题。 - tzot
我真的很喜欢这个方法。然而,在每个列表的末尾,\n会被打印在该行的最后一个值旁边。我该如何去掉它? - interstellar

10

请阅读 PEP8。你已经偏离了Python的约定。

如果您想要一个由逗号分隔的每行列表的列表,可以这样做:

l = []
for line in in_file:
    l.append(line.split(','))

每个记录都会换行。如果您不想要这个:

l = []
for line in in_file:
    l.append(line.rstrip().split(','))

1
一个文件几乎就是一系列行的列表。你可以轻松地在for循环中使用它。
myFile= open( "SomeFile.txt", "r" )
for x in myFile:
    print x
myFile.close()

或者,如果你想要一个实际的行列表,只需从文件创建一个列表。

myFile= open( "SomeFile.txt", "r" )
myLines = list( myFile )
myFile.close()
print len(myLines), myLines

你不能使用someList[i]来在列表末尾添加一个新的项目。你必须使用someList.append(i)

此外,永远不要以大写字母开头命名一个简单的变量名。 List会让熟悉Python的人感到困惑。

同样,永远不要将内置名称用作变量。 list是一种现有的数据类型,将其用作变量会让熟悉Python的人感到困惑。


我该如何了解Python编码规范?谢谢,我不知道你使用小写变量名称...有什么特殊原因吗?谢谢。 - UcanDoIt
1
当你在讨论编程规范时,PEP8也提到了括号内的空格。 :) - Dustin
请参阅http://www.python.org/dev/peps/pep-0008/,还可以查看https://dev59.com/V3VC5IYBdhLWcg3w21Mq。 - S.Lott
@Dustin:非常清楚PEP8中对括号内空格的建议。但是经过三十年的()内加空格,我不会改变。 - S.Lott
@Federico 当阅读你的代码并停下来思考为什么某些部分看起来与其余代码不同的人。例如,len()调用有什么特殊之处,使其与PEP8保持一致,但与其上面的行不一致?如果你不在意,请遵循惯例。 :) - Dustin
@Dustin:是的,琐碎的空格不一致是不一致的。我见过很多一开始根本不能工作的代码。我认为“能工作”比“一致的间距”更重要。如果间距导致难以理解,则首先需要解决更大的问题。 - S.Lott

1

f.readlines() 返回一个列表,其中每一行作为列表中的一个项目

如果你想要每一行被分割成“,”,你可以使用列表推导式

[ list.split(",") for line in file ]

1
假设您还希望去除每行开头和结尾的空格,您可以将字符串strip函数映射到readlines返回的列表上:
map(str.strip, open('filename').readlines())

0

...如果你想去掉\n

如果你的列表项带有 \n 并且你想要去掉它们:

with open('your_file.txt') as f:
    list= f.read().splitlines() 

-9

我不确定Python是否有,但大多数语言都有用于数组的push/append函数。


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