如何在Python中将某些值/字符串写入文件的特定列

2 投票
3 回答
1965 浏览
提问于 2025-04-16 04:23

我有一些值想要写入一个文本文件,但每个值必须放在每行的特定列上。

比如说,我有一个叫做 values = [a, b, c, d] 的列表,我想把它们写在同一行上,其中 a 要放在第10列,b 放在第25列,c 放在第34列,d 放在第48列。

我该怎么在 Python 中做到这一点呢?

Python 有没有类似 column.insert(10, a) 这样的功能?这样的话,我的工作会轻松很多。

谢谢你的帮助。

3 个回答

-1

你可以使用 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'])
1
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))
3

在这种情况下,我觉得你可以直接使用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

撰写回答