Backspace не работает в Python

1
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,]

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

Теги:
file
dictionary
io
backspace

6 ответов

1
Лучший ответ

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

for k, v in network.iteritems():
    output.write(str({k: v})[1:-1] + '\n')
  • 0
    Спасибо за помощь!
  • 0
    Не упоминай об этом!
5

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

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

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. Кроме того, если значения в словаре являются списками целых чисел или somesuch, тогда весь танец ", ".join(map(repr, v)) может быть ненужным.

  • 0
    Спасибо ... это помогает :)
4

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

str.join(iterable)

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

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

>>> [output.write("%s:%s\n" % item) for item in network.items()]
  • 0
    Спасибо за помощь :)
0

Попробуйте следующее:

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
    Спасибо за чаевые!
0

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

Однако, немного изменив код, вы можете получить следующее:

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()
0

Независимо от того, действительно ли символ backspace "backspaces" зависит от используемой оболочки.

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

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
    Спасибо за помощь!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню