Backspace не работает в Python - PullRequest
1 голос
/ 04 мая 2011
network={1:[2,3,4],2:[1,3,4], 3:[1,2], 4:[1,3,5], 5:[6,7,8], 6:[5,8],7:[5,6], 8:[5,6,7]}
str1='network.csv'
output = open(str1,'w')
for ii1 in network.keys():
    output.write(repr(ii1)+":[")
    for n in network[ii1]:
        output.write(' %s,'%(repr(n)))
    output.write('\b'+']\n')
output.close()

То, что я ожидаю, выглядит примерно так:

1:[ 2, 3, 4]
2:[ 1, 3, 4]
3:[ 1, 2]
4:[ 1, 3, 5]
5:[ 6, 7, 8]
6:[ 5, 8]
7:[ 5, 6]
8:[ 5, 6, 7]

но я получаю:

1:[ 2, 3, 4,]
2:[ 1, 3, 4,]
3:[ 1, 2,]
4:[ 1, 3, 5,]
5:[ 6, 7, 8,]
6:[ 5, 8,]
7:[ 5, 6,]
8:[ 5, 6, 7,]

Я новичок .... может кто-нибудь помочь?

Ответы [ 6 ]

5 голосов
/ 04 мая 2011

"\b" просто вставляет символ возврата ASCII ; он не удаляет только что записанный символ из выходного файла. Вот почему ваш код не ведет себя так, как вы ожидаете.

Теперь, чтобы исправить это, вы можете заменить

for ii1 in network.keys():
    output.write(repr(ii1)+":[")
    for n in network[ii1]:
        output.write(' %s,'%(repr(n)))
    output.write('\b'+']\n')

с

for ii1 in network.keys():
    output.write(repr(ii1)+":[ ")
    output.write(", ".join(map(repr, network[ii1])))
    output.write(']\n')

или, чтобы улучшить его, с помощью

for k, v in network.items():
    print >>output, "%s:[ %s]" % (repr(k), ", ".join(map(repr, v)))

Наконец, если ключи являются простыми целыми числами, как показывает ваш пример, то repr(k) можно упростить до k. Кроме того, если значения в словаре представляют собой списки целых чисел или что-то подобное, то весь танец ", ".join(map(repr, v)) может оказаться ненужным.

4 голосов
/ 04 мая 2011

Используйте str.join для генерации значений, разделенных запятыми, чтобы избежать необходимости возврата на обратную сторону:

str.join(iterable)

Возвращает строку, котораяэто конкатенация строк в итерируемой итерации.Разделителем между элементами является строка, обеспечивающая этот метод.

Более простой подход, например, список представлений итерация по элементам словаря:

>>> [output.write("%s:%s\n" % item) for item in network.items()]
1 голос
/ 04 мая 2011

Почему бы не использовать str(dict)?

for k, v in network.iteritems():
    output.write(str({k: v})[1:-1] + '\n')
0 голосов
/ 04 мая 2011

Независимо от того, является ли символ возврата символом «возврат», вероятно, зависит от используемой вами оболочки.

Гораздо проще и проще (и правильнее) просто выводить данные так, как вы этого хотите.отформатированный.

network={1:[2,3,4],2:[1,3,4], 3:[1,2], 4:[1,3,5], 5:[6,7,8], 6:[5,8],7:[5,6], 8:[5,6,7]}
output = open('network.csv','w')
for key,values in network.items():
    str_values = [str(x) for x in values]
    output.write('%s:[%s]' % (key,','.join(str_values))
output.close()
0 голосов
/ 04 мая 2011

Попробуйте:

network={1:[2,3,4],2:[1,3,4], 3:[1,2], 4:[1,3,5], 5:[6,7,8], 6:[5,8],7:[5,6], 8:[5,6,7]}
str1='network.csv'
with open(str1, 'w') as output:
    for ii1 in network.keys():
        output.write(repr(ii1)+":[")
        output.write(','.join(repr(n) for n in network[ii1]))
        output.write(']\n')

Вывод в network.csv:

1:[2,3,4]
2:[1,3,4]
3:[1,2]
4:[1,3,5]
5:[6,7,8]
6:[5,8]
7:[5,6]
8:[5,6,7]

Некоторые баллы:

  • Я использую with ... as ...:.Это гарантирует, что файл будет закрыт должным образом.

  • Я использую ','.join для создания списка через запятую.Это «питонный» способ объединения списков (или, точнее, итерируемых) строк.

0 голосов
/ 04 мая 2011

Вы не можете удалить символы, записанные в файле в целом.

Однако, немного переработав код, вы можете получить:

network={1:[2,3,4],2:[1,3,4], 3:[1,2], 4:[1,3,5], 5:[6,7,8], 6:[5,8],7:[5,6], 8:[5,6,7]}
str1='network.csv'
output = open(str1,'w')
for ii1 in network.keys():
    output.write(repr(ii1)+":[")
    first=false
    for n in network[ii1]:
        if first: 
             first=false
        else:
             output.write(',')
        output.write('%s'%(repr(n)))
    output.write('\b'+']\n')
output.close()
...