如何在Python中将某些值/字符串写入文件的特定列
我有一些值想要写入一个文本文件,但每个值必须放在每行的特定列上。
比如说,我有一个叫做 values = [a, b, c, d]
的列表,我想把它们写在同一行上,其中 a 要放在第10列,b 放在第25列,c 放在第34列,d 放在第48列。
我该怎么在 Python 中做到这一点呢?
Python 有没有类似 column.insert(10, a)
这样的功能?这样的话,我的工作会轻松很多。
谢谢你的帮助。
3 个回答
你可以使用 mmap
模块来对一个文件进行 内存映射
。
http://docs.python.org/library/mmap.html
使用 mmap
你可以做类似这样的事情:
fh = file('your_file', 'wb')
map = mmap.mmap(fh.fileno(), <length of the file you want to create>)
map[10] = a
map[25] = b
不确定这是不是你想要的,但可能会有用 :)
看起来我可能误解了问题。下面是之前的回答
也许你是在寻找 csv
模块?
http://docs.python.org/library/csv.html
import csv
fh = open('eggs.csv', 'wb')
spamWriter = csv.writer(fh, delimiter=' ')
spamWriter.writerow(['Spam'] * 5 + ['Baked Beans'])
spamWriter.writerow(['Spam', 'Lovely Spam', 'Wonderful Spam'])
class ColumnWriter(object):
def __init__(self, columns):
columns = (-1, ) + tuple(columns)
widths = (c2 - c1 for c1, c2 in zip(columns, columns[1:]))
format_codes = ("{" + str(i) + ":>" + str(width) +"}"
for i, width in enumerate(widths))
self.format_string = ''.join(format_codes)
def get_row(self, values):
return self.format_string.format(*values)
cw = ColumnWriter((1, 20, 21))
print cw.get_row((1, 2, 3))
print cw.get_row((1, 'a', 'a'))
如果你需要每一行的列数不一样,那么你可以用一行代码来实现。
import itertools
for columns in itertools.combinations(range(10), 3):
print ColumnWriter(columns).get_row(('.','.','.'))
这个代码在检查错误方面做得不够好。它需要确认一下 columns
是排好序的,并且 len(values) == len(columns)
。
它还有一个问题,就是当值的长度超过了分配给它的空间时,我不太确定该怎么处理。目前如果发生这种情况,它会覆盖之前的列。举个例子:
print ColumnWriter((1, 2, 3)).get_row((1, 1, 'aa'))
如果你有一组行想要写入文件,你可以这样做:
rows = [(1, 3, 4), ('a', 'b', 4), ['foo', 'ten', 'mongoose']]
format = ColumnWriter((20, 30, 50)).get_row
with open(filename, 'w') as fout:
fout.write("\n".join(format(row) for row in rows))
在这种情况下,我觉得你可以直接使用Python的填充功能,配合它的字符串格式化语法。
比如说,像这样 "%10d%15d%9d%14d"%values
,可以把a、b、c、d的最右边的数字放到你列出的那些列里。
如果你想把最左边的数字放到那里,可以用:"%<15d%<9d%<14d%d"%values
,然后在前面加上10个空格。
编辑:不知道为什么我对上面的语法有点困惑……所以我用了新的格式化语法,像这样:
" "*9 + "{:<14}{:<9}{:<14}{}".format(*values)
这样对于 values=[20,30,403,50]
来说,应该会打印出:
......... <-- from " "*9
20............ <-- {:<14}
30....... <-- {:<9}
403........... <-- {:<14}
50 <-- {}
----=----1----=----2----=----3----=----4----=----5 <-- guide
20 30 403 50 <-- Actual output, all together