Python 如何将每行的多个数组元素打印到文本文件中
我有一个1D数组,例如任意长度的Python 如何将每行的多个数组元素打印到文本文件中,python,list,output,text-files,Python,List,Output,Text Files,我有一个1D数组,例如任意长度的arr1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14] 如何将其打印到文本文件(整数/浮点数用空格分隔),以便每7个元素都打印在文本文件的同一行上 因此,我希望文本文件如下所示: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 第1行:1234567 第2行:89101121314 >>> [arr1[7 * i: 7 * i + 7] for i in range(
arr1=[1,2,3,4,5,6,7,8,9,10,11,12,13,14]
如何将其打印到文本文件(整数/浮点数用空格分隔),以便每7个元素都打印在文本文件的同一行上
因此,我希望文本文件如下所示:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19
第1行:1234567
第2行:89101121314
>>> [arr1[7 * i: 7 * i + 7] for i in range(0, 1 + len(arr1) / 7)]
[[1, 2, 3, 4, 5, 6, 7], [8, 9, 10, 11, 12, 13, 14], [15]]
然后,您只需在此列表中进行迭代,即可将其插入文件。您可以执行以下操作:
liNums = xrange(1, 20)
x = 0
line = ""
for i in liNums:
x+=1
line += "%s " % i
if not x%7:
line += "\n"
#send line to output, here I will just print it
print line
这里每7项添加一行。。。输出如下所示:
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19
希望有帮助
>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> for i in xrange(0,len(arr1),7):
... print arr1[i:i+7]
...
[1, 2, 3, 4, 5, 6, 7]
[8, 9, 10, 11, 12, 13, 14]
或者你可以:
>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
>>> results = map(str,arr1)
>>> for i in range(0,len(arr1),7):
... ','.join(results[i:i+7])
...
'1,2,3,4,5,6,7'
'8,9,10,11,12,13,14'
或者
将嵌套的join
s与izip
技术相结合:
print '\n'.join((' '.join(j) for j in izip(*[imap(str, arr1)]*7)))
您可以使用以下
zip
习惯用法对序列进行分块:
from itertools import izip
def chunk(seq, n):
return izip(*[iter(seq)]*n)
然后,您可以为写线
编写迭代器:
def chunkedlines(seq, n):
for line in chunk(seq, 7):
yield ' '.join(str(item) for item in line)
yield "\n"
最后使用它:
from StringIO import StringIO
fp = StringIO('wb')
arr1 = range(1, 15)
fp.writelines(chunkedlines(arr1, 7))
print fp.getvalue()
您的问题可分为三个部分:
grouper
方法,如中所述:
您可以轻松地将任意长度的列表拆分为所需长度的块。例如:
>>> arr1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
>>> for chunk in grouper(7, arr1): print chunk
...
(1, 2, 3, 4, 5, 6, 7)
(8, 9, 10, 11, 12, 13, 14)
(15, 16)
使用空格作为分隔符打印整数/浮点列表
将列表加入字符串的标准方法是使用。但是,这只适用于字符串列表,因此我们需要首先将每个元素转换为其字符串表示形式。这里有一个方法:
>>> a = [1, 2, 3, 4]
>>> print " ".join(str(x) for x in a)
1 2 3 4
在上一个示例中使用此方法,我们得到:
>>> for chunk in grouper(7, arr1):
... print " ".join(str(x) for x in chunk)
...
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16
这几乎就是你想要的输出。现在我们需要做的就是把它写入一个文件
写入文件
有关详细信息,请参见。在Python中,考虑“生成器”
结果
1 2 3 4 5 6 7
8 9 10 11 12 13 14
101 203 514 201 567 849
如果要参数化每行中的数字数量,请创建一个生成器函数:
def yn(li,n):
for i,x in enumerate(li,1):
yield '%-5s ' % x
if i%n==0:
yield '\n'
print ''.join(yn(li,7))
可能最好将其作为生成器表达式,而不是列表理解。我认为如果
len(arr1)%7==0
,这并不能满足您的需要。尝试(6+len(arr1))/7
。是的:如果arr1=[1,2,3,4,5]
,它会给出[[1,2,3,4,5]]
。还是我误解了你?很简单,这比重型机械好。您可以通过对范围(0,len(arr1),7)内的i执行'\n'.join(','.join(结果[i:i+7])
来提高写入速度。您有一个很好的算法(我有相同的!)。使用生成器和enumerate()
您将获得Python精神。我明白您的意思,请留下这行代码,而不是仅仅追加\n当我回答这个问题时,我写下了这个问题会突然出现在我脑海中的第一件事:pizip(*[iter(seq)]*n)
Phew!!我不知道它是否很快,但它很棘手!它之所以有效,是因为[iter(seq)]*n
创建了一个长度n
的列表,所有元素都等于同一迭代器。
with open("outfile.txt", "w") as f:
for chunk in grouper(7, arr1):
f.write(" ".join(str(x) for x in chunk) + "\n")
output=''
col = 0
for i in arr1:
output +="%s " % i #write an element of the array to the output and append a space
col += 1 #count the number of elements on the current line
if col==7: #if 7 elements have been entered, append a new line and restart the count
output += "\n"
col = 0
f = open("filepath.txt",'w') #open a file (replace filepath.txt with the actual filename)
f.write(output) # write the output to the text file
f.close() #close the file object
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,101,
203,514,201,567,849]
gen = ('%-5s\n' % x if i%7==0 else '%-5s' %x
for i,x in enumerate(li,1))
print ''.join(gen)
1 2 3 4 5 6 7
8 9 10 11 12 13 14
101 203 514 201 567 849
def yn(li,n):
for i,x in enumerate(li,1):
yield '%-5s ' % x
if i%n==0:
yield '\n'
print ''.join(yn(li,7))