Строки и целые числа Python для записи в файл?

-4

Я новичок в Python, поэтому я не уверен, как это сделать.

У меня есть список строк для записи в файл. Каждой строке должно предшествовать 32-битное целое число, равное длине строки.

Мне нужно иметь все данные, которые будут записаны в файл, прежде чем я напишу его в файл. В С# я должен хранить все в байтовом массиве перед написанием, но я не знаю, что делать в Python. Должен ли я использовать список или есть лучший тип данных? Как сохранить информацию?

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

00 00 00 04 74 65 73 74

четыре байта целого числа в большом конце, за которым следует строка.

спросил(а) 2012-04-20T05:04:00+04:00 8 лет, 6 месяцев назад
0
93

Если данные хранятся в списке с именем "данные", и вы хотите, чтобы ваш вывод перешел в файл с именем "data.out", следующий код выполнит это:

data = ['this', 'is', 'a', 'complicated and long', 'test']

with open('data.out', 'w') as outfp:
for d in data:
outfp.write('%4d %s\n' %(len(d), d))

выходы:

  4 this
2 is
1 a
20 complicated and long
4 test

как вывод в файле 'data.out'. Обратите внимание, что "4" в% 4d помогает выровнять числа с ведущими пробелами, чтобы получилось отформатированное красиво.


В качестве альтернативы, если вы хотите получить целые значения ASCII для символов:

with open('data.out', 'w') as outfp:
for d in data:
outfp.write('%4d %s\n' %(len(d), ' '.join([str(ord(i)) for i in d])))

и вы получите

  4 116 104 105 115
2 105 115
1 97
20 99 111 109 112 108 105 99 97 116 101 100 32 97 110 100 32 108 111 110 103
4 116 101 115 116

ответил(а) 2012-04-20T05:12:00+04:00 8 лет, 6 месяцев назад
70

Вы можете использовать лямбда-выражения для легкого создания нового списка в соответствии со строками и требованиями к форматированию, например:

strings = ['abc', 'abcde', 'abcd', 'abcdefgh']
outputs = map(lambda x: "%d %s" % (len(x), x), strings) # ['3 abc', '5 abcde', '4 abcd', '8 abcdefgh']
f = open("file.out", 'w')
data = '\n'.join(outputs) # Concat all strings in list, separated by line break
f.write(data)
f.close()

ответил(а) 2012-04-20T05:25:00+04:00 8 лет, 6 месяцев назад
41

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

Для работы с двоичными данными вы, вероятно, захотите использовать модуль struct. Функция пакета позволяет вам преобразовывать длины строк в их двоичные представления. Поскольку он возвращает строку, вы можете легко объединить ее со строками, которые вы хотите вывести.

Пример ниже, похоже, работал с Python 2.7

import struct
strings = ["a", "ab", "abc"]

with open("output.txt", "wb") as output:
for item in strings:
output.write("{0}{1}".format(struct.pack('>i', len(item)), item))

ответил(а) 2012-04-20T07:02:00+04:00 8 лет, 6 месяцев назад
41

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

У меня получилось что-то вроде:

import struct

output=''
mystr = 'testing str'
strlen = len(mystr)
output += struct.pack('>i',strlen) + mystr

ответил(а) 2012-04-20T05:30:00+04:00 8 лет, 6 месяцев назад
41

Словарь будет приемлемым. Что-то вроде:

strings = ['a', 'aa', 'aaa', 'aaaa'] #you'd get these
data = dict() #stores values to be written.
for string in strings:
length = len(string)
data.update({string: length})
#this is just a check, you would do something similar to write the values to a file.
for string, length in data.items():
print string, length

ответил(а) 2012-04-20T05:14:00+04:00 8 лет, 6 месяцев назад
42

Скажем, у вас есть список строк, хранящихся в list_of_strings и у вас есть файл, открытый для записи как file_handle. Выполните следующие действия (непроверенные)

for line in list_of_strings:
length_of_string = len(line)
line = str(length_of_string) + " " + line
file_handle.write(line)

ответил(а) 2012-04-20T05:10:00+04:00 8 лет, 6 месяцев назад
41

Это делает большую строку со всеми данными, как вы просили:

>>> l = ["abc", "defg"]
>>> data = '\n'.join("%d %s" % (len(x), x) for x in l)
>>> data
3 abc
4 defg

Затем напишите его в файл следующим образом:

f = open("filename", "w")
f.write(data)
f.close()

ответил(а) 2012-04-20T05:08:00+04:00 8 лет, 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема