13

If I have a text file like this:

Hello World
How are you?
Bye World

How would I read it into a multidimensional array like this:

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

I have tried:

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

But it just returns:

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

How do I read the file into a multidimensional array?

2
  • 3
    lines = map(str.split, open('testFile.txt')) Commented Sep 27, 2013 at 16:53
  • @falsetru interesting. it is fastest I think. Post an answer. Commented Sep 27, 2013 at 16:57

5 Answers 5

19

Use a list comprehension and str.split:

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

Demo:

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

with statement:

It is good practice to use the with keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way. It is also much shorter than writing equivalent try-finally blocks.

Sign up to request clarification or add additional context in comments.

1 Comment

@GrijeshChauhan str.split() with no arguments takes care of all type of whitespace characters.
4

You can use map with the unbound method str.split:

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

In Python 3.x, you have to use list(map(str.split, ...)) to get a list because map in Python 3.x return an iterator instead of a list.

3 Comments

Is it should be map(lambda line: line.split, open('testFile.txt')), when I do str.splite it says str not object.
@GrijeshChauhan, You don't need lambda, because str.split is unbound method. 'a b c'.split() is like str.split('a b c').
@GrijeshChauhan, str.splite? Is it a typo? Or, did you overwrite str?
1

Adding to the accepted answer:

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

This will remove '\n' if it is appended to the end of each line.

Comments

0

Also don't forget to use strip to remove the \n:

myArray = []
textFile = open("textFile.txt")
lines = textFile.readlines()
for line in lines:
    myArray.append(line.split(" "))

Comments

0

A good answer would be :

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)

Which is optimized for readability.

But python syntax let's us use less code:

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)

And also python let's us do it only in one line!!

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.