#python #file #dictionary #io #backspace
#python #файл #словарь #io #backspace
Вопрос:
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,]
Я новичок …. может кто-нибудь, пожалуйста, помочь?
Ответ №1:
"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))
танец может оказаться ненужным.
Ответ №2:
Используйте str.join
для генерации значений, разделенных запятыми, чтобы избежать необходимости в обратном пространстве:
str.join(iterable)
Возвращает строку, которая является конкатенацией строк в iterable iterable. Разделителем между элементами является строка, предоставляющая этот метод.
Более простым подходом является, например, повторение понимания списка по элементам словаря:
>>> [output.write("%s:%sn" % item) for item in network.items()]
Ответ №3:
Почему бы не использовать str(dict)
?
for k, v in network.iteritems():
output.write(str({k: v})[1:-1] 'n')
Ответ №4:
Вы не можете удалять символы, записанные в файле в целом.
Однако, немного изменив свой код, вы можете получить это:
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()
Ответ №5:
Действительно ли символ обратного пробела ‘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()
Ответ №6:
Попробуйте это:
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
для создания списка, разделенного запятыми. Это «питонический» способ объединения списков (или, точнее, итерируемых) строк.