Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 17, 2009 15:07:18

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Доброе время суток!

Не могу справиться со следующей проблемой: необходимо записать в текстовый файл массив по, скажем, восемь элементов в строке. При чем длина массива не обязательна кратна восьми.

Т.е. если имеем

import numpy

a=numpy.arange(26)
То после записи массива a в файл это должно выглядеть:

1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25

Заранее благодарен.



Офлайн

#2 Сен. 17, 2009 16:26:57

GDK
От:
Зарегистрирован: 2009-08-21
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

list1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]

tmpstr=''
down='\n'
i=0
m=1

for i in list1:
tmpstr=tmpstr+str(i) + ' '
if i==8*m:
tmpstr=tmpstr + down
m=m+1
i=i+1

print tmpstr
Это не массив и не текстовый файл. Вместо массива список, вместо файла - строковая переменная. Я в файл писать не умею пока. И про модуль numpy не знаю. Но принцип - цикл.
А у крутых питонеров хочется поинтересоваться насчёт “стиля” написания - какие будут замечания?



Отредактировано (Сен. 17, 2009 16:27:47)

Офлайн

#3 Сен. 17, 2009 17:25:46

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Я конечно, не крутой, а так, в мешочек, но замечания есть:

list1 = range(27) # правильнее
m = 0 # так привычнее, ибо принято нумеровать с 0
m += 1 # просто короче
А вот так никогда не пишите! Написано только для получения лулзов:
arr = range(27)
filt = filter(lambda x: x/8 == 0, len(arr))
for x in filt: print >>open('text.txt','aw'),' '.join(map(lambda x: str(x),arr[x:(x+8) or max]))
Кто разберёт - тому пирожок.

Офлайн

#4 Сен. 17, 2009 20:35:11

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Ferroman
Кто разберёт - тому пирожок.
Трудно его разобрать - оно падает:
Traceback (most recent call last):
File “test12.py”, line 19, in <module>
filt = filter(lambda x: x/8 == 0, len(arr))
TypeError: ‘int’ object is not iterable

вот мой вариант:
from itertools import groupby
print >>open('text.txt','w'), '\n'.join([' '.join(["%2d" % i for i in g]) for k,g in groupby(xrange(1, 26), lambda x: (x-1)/8)])
Файл выглядит так:
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25



Офлайн

#5 Сен. 17, 2009 23:27:56

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Я код не проверял, вот range() и забыл. И остаток от деления надо, а не целочисленное.

arr = range(27)
filt = filter(lambda x: x%8 == 0, range(len(arr)))
for x in filt: print >>open('text.txt','aw'),' '.join(map(lambda x: str(x),arr[x:(x+8) or max]))
Можно и в одну строчку записать. Но в две понятнее.

Отредактировано (Сен. 17, 2009 23:29:59)

Офлайн

#6 Сен. 18, 2009 10:05:23

GDK
От:
Зарегистрирован: 2009-08-21
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Код:
list1 = range(27) # правильнее а почему? я там для наглядности написал. Просто так лучше - тоже ответ.
m = 0 # так привычнее, ибо принято нумеровать с 0 это не нумерация, логика нарушится.
m += 1 # просто короче

А вот так никогда не пишите! Почему?
Код:
arr = range(27)
filt = filter(lambda x: x/8 == 0, len(arr))
for x in filt: print >>open('text.txt','aw'),' '.join(map(lambda x: str(x),arr))
Спасибо за советы.

А по оптимизации никаких комментариев? Я вот думая в том коде в каждой итерации будет вычисляться m*8 что есть некоторая задержка.
О! кажется:

list1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]

tmpstr=''
down='\n'
i=0
m=8
for i in list1:
tmpstr=tmpstr+str(i) + ' '
if i==m:
tmpstr=tmpstr + down
m=m+8
i=i+1

print tmpstr



Офлайн

#7 Сен. 18, 2009 10:08:31

Mottle
От:
Зарегистрирован: 2009-03-13
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Спасибо, все работает!

Сделал вот так:

import numpy as np    

arr = np.arange(1,27)

filt = filter(lambda x: x%8 == 0, range(len(arr)))

f=open('text.txt','w')
for x in filt:
f.write(' '.join(map(lambda x: str(x),arr[x:(x+8) or max]))+'\n')
f.close()
Теперь вопрос, как такой файл так же красиво и лаконично прочитать? Потому как я это делаю не так изящно, а может быть даже и коряво:

import numpy as np    
import string

f=open('text.txt','r')
text=f.readlines()
f.close()

text1=''
for i in range(len(text)):
text1+=text[i]
text1=string.split(text1)

arr2=np.array([0.0]*len(text1))

for i in range(len(text1)):
arr2[i]=float(text1[i])



Офлайн

#8 Сен. 18, 2009 10:42:31

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Mottle
Сделал вот так:
А зачем numpy? Можно сделать обычным xrange по-моему:
f=open('text.txt','w')
line=''
for i in xrange(1,26):
line += " %d" % i
if not i % 8 or i == 25:
f.write(line + '\n')
line = ''
f.close()
И никаких лямбд :)



Офлайн

#9 Сен. 18, 2009 10:55:34

GDK
От:
Зарегистрирован: 2009-08-21
Сообщения: 68
Репутация: +  0  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

А как думаете f=open('text.txt','w') копирует файл в оперативку и потом f.close() сохраняет изменения?? или при каждом f.write(line + ‘\n’) происходит обращение к жёстк. диску?



Офлайн

#10 Сен. 18, 2009 10:57:01

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Запись массива в текстовый файл по n элементов в строке

Mottle
Теперь вопрос, как такой файл так же красиво и лаконично прочитать?
Так?
result = []
for line in open('text.txt','r'):
result.extend([int(i) for i in line.split()])



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version