2015-08-24 3 views
2

Я пытаюсь записать определенное количество байтов строки в файл. В C это было бы тривиально: поскольку каждый символ равен 1 байт, я просто напишу сколько бы символов из строки, которую я хочу.Как отрезать определенное количество байтов от строки в Python?

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

вещи я попытался:

ByteArray,: (для $, прочитать >>>, который портит форматирование.)

$ barray = bytearray('a') 
$ import sys 
$ sys.getsizeof(barray[0]) 
24 

Так превращение персонажа в ByteArray не превратить его в массив байтов, как я ожидал, и мне не ясно, как изолировать отдельные байты.

нарезка байтовые объекты, как описано here:

$ value = b'a' 
$ sys.getsizeof(value[:1]) 
34 

Опять же, размер 34 явно не 1 байт.

memoryview:

$ value = b'a' 
$ mv = memoryview(value) 
$ sys.getsizeof(mv[0]) 
34 
$ sys.getsizeof(mv[0][0]) 
34 

Ord():

$ n = ord('a') 
$ sys.getsizeof(n) 
24 
$ sys.getsizeof(n[0]) 

Traceback (most recent call last): 
    File "<pyshell#29>", line 1, in <module> 
    sys.getsizeof(n[0]) 
TypeError: 'int' object has no attribute '__getitem__' 

Так как я могу разрезать строку на определенное количество байт? Меня не волнует, что нарезка строки фактически приводит к сохранению отдельных символов или что-либо, что касается C; это просто должно быть одинаковым каждый раз.

ответ

2

Убедитесь, что строка закодирована в массив байтов (это поведение по умолчанию в Python 2.7).

А затем просто нарежьте строковый объект и напишите результат в файл.

In [26]: s = '一二三四' 

In [27]: len(s) 
Out[27]: 12 

In [28]: with open('test', 'wb') as f: 
    ....:  f.write(s[:2]) 
    ....: 

In [29]: !ls -lh test 
-rw-r--r-- 1 satoru wheel  2B Aug 24 08:41 test 
+0

Ничего себе. Я не знал, что write() и разделение строки, как это могло бы сделать это. Что меня отбросило, так это то, что sys.getsizeof (s [: 1]) возвращался 34. Спасибо! – user124384

+1

@ user124384 Что означает 'sys.getsizeof', это размер объекта' String', а не массив базового байта. – satoru

+0

Я вижу. Как можно получить размер базового массива байтов? Как я показал в своих примерах, просто использование 'getsizeof()' на байтарах не похоже на это. – user124384