Backspace не работает в Python
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 ответов
Почему бы не использовать str(dict)
?
for k, v in network.iteritems():
output.write(str({k: v})[1:-1] + '\n')
"\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))
танец может быть ненужным.
Использование str.join
для генерации запятых-значений, чтобы избежать необходимости возврата
str.join(iterable)
Возвращает строку, которая является объединением строк в итерируемой итерации. Разделителем между элементами является строка, предоставляющая этот метод.
Более простым подходом является, например, понимание списка, повторяющееся по элементам словаря:
>>> [output.write("%s:%s\n" % item) for item in network.items()]
То, является ли символ возврата на самом деле '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()
Попробуй это:
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
создать список через запятую. Это "питонный" способ объединения списков (или, точнее, итерируемых) строк.
Вы не можете удалить символы, записанные в файле в целом.
Однако, немного переработав код, вы можете получить это:
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()