Найти - Пользователи
Полная версия: Запись массива в текстовый файл по n элементов в строке
Начало » Python для новичков » Запись массива в текстовый файл по n элементов в строке
1 2 3
Mottle
Доброе время суток!

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

Т.е. если имеем
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

Заранее благодарен.
GDK
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 не знаю. Но принцип - цикл.
А у крутых питонеров хочется поинтересоваться насчёт “стиля” написания - какие будут замечания?
Ferroman
Я конечно, не крутой, а так, в мешочек, но замечания есть:
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]))
Кто разберёт - тому пирожок.
Ed
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
Ferroman
Я код не проверял, вот 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]))
Можно и в одну строчку записать. Но в две понятнее.
GDK
Код:
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
Mottle
Спасибо, все работает!

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

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])
Ed
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()
И никаких лямбд :)
GDK
А как думаете f=open('text.txt','w') копирует файл в оперативку и потом f.close() сохраняет изменения?? или при каждом f.write(line + ‘\n’) происходит обращение к жёстк. диску?
Ed
Mottle
Теперь вопрос, как такой файл так же красиво и лаконично прочитать?
Так?
result = []
for line in open('text.txt','r'):
result.extend([int(i) for i in line.split()])
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