Python:属性错误:'_io.TextIOWrapper'对象没有'split'属性。

47

我有一个文本文件,叫做goodlines.txt,我想加载它,并创建一个包含该文本文件中每一行的列表。

我尝试使用以下方式的split()函数:

>>> f = open('goodlines.txt')
>>> mylist = f.splitlines()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: '_io.TextIOWrapper' object has no attribute 'splitlines'
>>> mylist = f.split()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: '_io.TextIOWrapper' object has no attribute 'split'

为什么我会遇到这些错误?我使用split()的方式不正确吗?(我正在使用Python 3.3.2

3个回答

54

您正在对打开的文件对象使用str 方法。

您可以通过在文件对象上简单地调用list() 来将文件读取为行的列表:

with open('goodlines.txt') as f:
    mylist = list(f)

这包括换行符。你可以在列表推导式中剥离它们:
with open('goodlines.txt') as f:
    mylist = [line.rstrip('\n') for line in f]

12

试试这个:

 >>> f = open('goodlines.txt')
 >>> mylist = f.readlines()

open()函数返回一个文件对象。对于文件对象,不存在splitlines()split()这样的方法。您可以使用dir(f)命令查看文件对象的所有方法。


没问题,但是我每次都在每个末尾得到这些"\n"东西...我怎么才能在不改变文本文件的情况下将它们删除? - Kaizer von Maanen

11

你没有读取文件内容:

my_file_contents = f.read()

请参阅文档以获取更多信息。

您可以在不调用read()readlines()的情况下循环遍历文件对象:

f = open('goodlines.txt')
for line in f:
    print(line)
如果您想要一个列表(如您所请求的)但不包括\n,请使用以下代码:
my_list = [line.rstrip('\n') for line in f]

2
列表推导式不会去除换行符。你可以直接调用 list(f),与你的当前代码产生相同的效果。 - Martijn Pieters
@samuele-mattiuzzo "my_list = [line for line in f]" 这段代码创建了一个列表,其中每个元素都是文件 f 中的一行。即使文本文件中没有换行符,它也会在每行末尾添加 \n。但是,当读取时,应该可以使用 split 函数来分割每行。 - Kaizer von Maanen
正如Pieters先生迅速指出的那样,\n需要被剥离。 - Samuele Mattiuzzo

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