Как бы я написал некоторые значения / строки в конкретных столбцах файла в Python - PullRequest
2 голосов
/ 21 сентября 2010

У меня есть некоторые значения, которые я хочу записать в текстовый файл с ограничением, что каждое значение должно идти в определенный столбец каждой строки.

Например, допустим, что у меня есть values = [a, b, c, d], и я хочу записать их в строку так, чтобы a было записано в 10-м столбце строки, b - 25-м, c - 34-м, и d в 48-й колонке.

Как бы я сделал это в Python?

Есть ли у python что-то вроде column.insert(10, a)? Это облегчит мне жизнь.

Я ценю твою гепатиту.

Ответы [ 3 ]

3 голосов
/ 21 сентября 2010

В этом случае, я бы подумал, что вы просто используете функции заполнения с синтаксисом строкового форматирования .

в Python.

Что-то вроде "%10d%15d%9d%14d"%values поместит крайнюю правую цифру a, b, c, d в перечисленные вами столбцы.

Если вы хотите разместить там самые левые цифры, вы можете использовать: "%<15d%<9d%<14d%d"%values и добавить 10 пробелов.

РЕДАКТИРОВАТЬ: По какой-то причине у меня проблемы с вышеуказанным синтаксисом ... поэтому я использовал синтаксис форматирования newstyle примерно так:

" "*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
1 голос
/ 21 сентября 2010
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))
0 голосов
/ 21 сентября 2010

Вы можете использовать модуль mmap для memory-map файла.

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'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...