Найти - Пользователи
Полная версия: Ламерский вопрос про двухмерных массив и чтение из файла.
Начало » Python для новичков » Ламерский вопрос про двухмерных массив и чтение из файла.
1
serega_sh
Здравствуйте, у меня ламерский вопрос. Помогите, пожалуйста.
Есть файл:
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()
Я как бы объявил глобальный двухмерный массив data [], но не понимаю, как в него писать считываемые числа ( digit.isdigit() )

Если я вытаскиваю циферки из файла как ламер, дайте ссылку на хороший пример.
Скажите, как записывать собранные числа массив.

Спасибо
sypper-pit
open(r'<путь_до_фаила>').readlines()[0] #выбиваем первую строку
open(r'<путь_до_фаила>').readlines()[1] #выбиваем вторую строку

open(r'<путь_до_фаила>').readlines()[0].split("\t")[0] #первый символ из первой строки
кажется так…
serega_sh
Сделал такую штуку:

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])
Я получу вожделенную 4
WTF, не пойму, откуда берется пустая строка, может, это из-за того, что я data криво объявил?

Что делать?
serega_sh
Надо так объявлять:
data = []
Тогда никаких пустых списков не будет. И эта строчка - лишняя:
if len(temp) > 0:
Поговорив с умным человеком, разобрался.
Андрей Светлов
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'))
serega_sh
Андрей Светлов
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')]
Можно еще по разному. Но первый - оптимальней для начала.
serega_sh
Андрей Светлов
Кстати, более короткий вариант:
[[int(i) for i in line.split()] for line in open('input_file.txt')]
Можно еще по разному. Но первый - оптимальней для начала.
Это все тяжелое наследние Java. Спасибо большое!
Когда изучаешь язык, важно с самого начала понять его идеологию. А то начнешь писать неправильно, а переучиться потом будет очень сложно.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB