Форум сайта python.su
Здравствуйте, у меня ламерский вопрос. Помогите, пожалуйста.
Есть файл:
24 28
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 4
…..
…..
и так 24 столбца и 28 строк.
Первая строка - размер двухмерного массива.
Разделители чисел - табуляторы.
Задача - считать файл в двумерный массив с числами.
С чтением худо-бедно разобрался. Скажите, это ламерский способ или нет:
data = [[]]
def read_data_from_file():
f = open('data.txt', 'r')
linesFromFile = f.readlines()
counter = 0
for line in linesFromFile:
digit = ""
for symbol in line:
if symbol.isdigit():
digit = digit + symbol
else:
if digit.isdigit():
print "digit:" + digit
digit = ""
counter = counter + 1 #counter for row array index...
#start execution
read_data_from_file()
Офлайн
open(r'<путь_до_фаила>').readlines()[0] #выбиваем первую строку
open(r'<путь_до_фаила>').readlines()[1] #выбиваем вторую строку
open(r'<путь_до_фаила>').readlines()[0].split("\t")[0] #первый символ из первой строки
Отредактировано (Апрель 9, 2009 21:37:07)
Офлайн
Сделал такую штуку:
1. Убрал размер матрицы, она прямоугольная.
2. Почему-то первая строка в двухмерном массив - пустая. Не пойму, почему:
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 0 4
1 0 0 1 0 1 0 1 0 1 0 1 0 0 1 0 0 0 1 0 1 0 1 1
1 0 0 1 0 0 0 1 0 1 0 1 1 0 1 0 1 0 1 1 1 0 1 1
И так еще 24 строки
data = [[]]
def read_data_from_file():
f = open('data.txt', 'r')
linesFromFile = f.readlines()
row = 0
column = 0
for line in linesFromFile:
row = row + 1
temp = []
digit = ""
for symbol in line:
if symbol.isdigit():
digit = digit + symbol
else:
if digit.isdigit():
temp.append(int(digit))
column = column + 1
digit = ""
if len(temp) > 0:
data.append(temp)
print "row -> " + str(temp) + "<-"
print "all rows = " +str(row)
print "all columns = " + str(column/row)
#start execution
read_data_from_file()
print "test (expected 4) = " + str(data[1][23])
row -> <-Несмотря на то, что первая пустая строка в выводе не отображается, она есть.
row -> <-
И так еще 26 строк
all rows = 28
all columns = 24
test (expected 4) = 1
print "test (expected 4) = " + str(data[2][23])
Отредактировано (Апрель 9, 2009 21:49:37)
Офлайн
Надо так объявлять:
data = []
if len(temp) > 0:
Отредактировано (Апрель 9, 2009 22:11:24)
Офлайн
def read(f):
out = []
for line in f:
row = [int(i) for i in line.split()]
out.append(row)
return out
print read(open('input_file.txt'))
Офлайн
Андрей СветловЖесть, какой я лол. Спасибо большое!def read(f):
out = []
for line in f:
row = [int(i) for i in line.split()]
out.append(row)
return out
print read(open('input_file.txt'))
Офлайн
Не робей. Когда я начинал возиться с питоном - примерно так же тупил. К счастью, быстро прошло.
Офлайн
Кстати, более короткий вариант:
[[int(i) for i in line.split()] for line in open('input_file.txt')]
Офлайн
Андрей СветловЭто все тяжелое наследние Java. Спасибо большое!
Кстати, более короткий вариант:Можно еще по разному. Но первый - оптимальней для начала.[[int(i) for i in line.split()] for line in open('input_file.txt')]
Офлайн