使用Python将文件读入多维数组

13

如果我有一个像这样的文本文件:

Hello World
How are you?
Bye World

我该如何将它读入到类似于这样的多维数组中:

[["Hello", "World"],
 ["How", "are", "you?"],
 ["Bye" "World"]]

我已经尝试过:

textFile = open("textFile.txt")
lines = textFile.readlines()
for line in lines:
    line = lines.split(" ")

但它只会返回:

["Hello World\n", "How are you?\n", "Bye World"]

我该如何将文件读入多维数组?


3
lines = map(str.split, open('testFile.txt')) - falsetru
@falsetru 很有趣。我认为这是最快的。发布一个回答。 - Grijesh Chauhan
5个回答

19

使用列表推导式和 str.split

with open("textFile.txt") as textFile:
    lines = [line.split() for line in textFile]

演示:

>>> with open("textFile.txt") as textFile:
        lines = [line.split() for line in textFile]
...     
>>> lines
[['Hello', 'World'], ['How', 'are', 'you?'], ['Bye', 'World']]

with语句:

处理文件对象时,使用with关键字是一种很好的实践。这样做的好处是,在其语句块执行完毕后,文件被正确关闭,即使在执行过程中发生异常。而且,与编写等效的try-finally代码块相比,with语句更加简洁。


1
@GrijeshChauhan str.split() 没有参数时,会处理所有类型的空格字符。 - Ashwini Chaudhary

4

您可以使用map未绑定方法str.split

>>> map(str.split, open('testFile.txt'))
[['Hello', 'World'], ['How', 'are', 'you?'], ['Bye', 'World']]

在Python 3.x中,你需要使用list(map(str.split, ...))来获取列表,因为Python 3.x中的map返回的是一个迭代器而不是一个列表。

当我使用str.split时它会说str不是对象,所以应该是map(lambda line: line.split(), open('testFile.txt')) - Grijesh Chauhan
1
@GrijeshChauhan,您不需要使用lambda,因为str.split是无需绑定的方法。'a b c'.split()就像str.split('a b c')一样。 - falsetru
@GrijeshChauhan,str.split?这是打错字了吗?还是你覆盖了str - falsetru

1

补充已接受的答案:

with open("textFile.txt") as textFile:
    lines = [line.strip().split() for line in textFile]

这将删除每行末尾添加的“\n”。

0
一个好的答案应该是:
def read_text(path):
    with open(path, 'r') as file:
        line_array = file.read().splitlines()
        cell_array = []
        for line in line_array:
            cell_array.append(line.split())
        print(cell_array)

这是为了可读性而优化的。

但 Python 语法让我们使用更少的代码:

def read_text(path):
    with open(path, 'r') as file:
        line_array = file.read().splitlines()
        cell_array = [line.split() for line in line_array]
        print(cell_array)

而且Python还让我们只需一行代码就能实现它!

def read_text(path):
    print([[item for item in line.split()] for line in open(path)])

0
还有不要忘记使用strip来移除\n
myArray = []
textFile = open("textFile.txt")
lines = textFile.readlines()
for line in lines:
    myArray.append(line.split(" "))

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