开发者

Splitting Text File Into Columns and Rows in Python

开发者 https://www.devze.com 2023-02-15 22:35 出处:网络
I have a newbie question. I need help on separating a text file into columns and rows. Let\'s say I h开发者_运维百科ave a file like this:

I have a newbie question. I need help on separating a text file into columns and rows. Let's say I h开发者_运维百科ave a file like this:

1 2 3 4

2 3 4 5

and I want to put it into a 2d list called values = [[]]

i can get it to give me the rows ok and this code works ok:

values = map(int, line.split(','))

I just don't know how I can say the same thing but for the rows and the documentation doesn't make any sense

cheers


f = open(filename,'rt')
a = [[int(token) for token in line.split()] for line in f.readlines()[::2]]

In your sample file above, you have an empty line between each data row - I took this into account, but you can drop the ::2 subscript if you didn't mean to have this extra line in your data.

Edit: added conversion to int - you can use map as well, but mixing list comprehensions and map seems ugly to me.


import csv
import itertools

values = []

with open('text.file') as file_object:
    for line in csv.reader(file_object, delimiter=' '):
        values.append(map(int, line))

print "rows:", values
print "columns"
for column in itertools.izip(*values):
    print column

Output is:

rows: [[1, 2, 3, 4], [2, 3, 4, 5]]
columns:
(1, 2)
(2, 3)
(3, 4)
(4, 5)


Get the data into your program by some method. Here's one:

f = open(tetxfile, 'r')
buffer = f.read()
f.close()

Parse the buffer into a table (note: strip() is used to clear any trailing whitespace):

table = [map(int, row.split()) for row in buffer.strip().split("\n")]

>>> print table
[[1, 2, 3, 4], [2, 3, 4, 5]]

Maybe it's ordered pairs you want instead, then transpose the table:

transpose = zip(*table)
>>> print transpose
[(1, 2), (2, 3), (3, 4), (4, 5)]


You could try to use the CSV-module. You can specify custom delimiters, so it might work.


If columns are separated by blanks

import re

A,B,C,D = [],[],[],[]
pat = re.compile('([^ ]+)\s+([^ ]+)\s+([^ ]+)\s+([^ ]+)')

with open('try.txt') as f:
    for line in f:
        a,b,c,d = pat.match(line.strip()).groups()
        A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))

or with csv module

EDIT

A,B,C,D = [],[],[],[]    
with open('try.txt') as f:
    for line in f:
        a,b,c,d = line.split()
        A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))

But if there are more than one blank between elements of data, this code will fail

EDIT 2

Because the solution with regex has been qualified of extremely hard to understand, it can be cleared as follows:

import re

A,B,C,D = [],[],[],[]
pat = re.compile('\s+')

with open('try.txt') as f:
    for line in f:
        a,b,c,d = pat.split(line.strip())
        A.append(int(a));B.append(int(b));C.append(int(c));D.append(int(d))
0

精彩评论

暂无评论...
验证码 换一张
取 消