나는 파이썬에 익숙하지 않기 때문에 나는 기본적인 것들을 모른다. 개체 배열이 들어있는 이진 파일이 있습니다. 저장된 객체는 전통적인 C 구조입니다. 나는 그 구조를 파이썬으로 재창조하고 그것의 객체 목록에있는 파일 내용을 읽고, 데이터를 수정하고 그것을 다시 저장하고 싶습니다. 내가 문제가있는 부분은 파일 내용을 읽는 것입니다. 나는 파일을 읽는 것에 관한 비슷한 질문을 읽었지 만 나는 가지고있는 질문에 답하지 않았다. 나는 클래스를 정의하고 클래스 멤버를 __slot__
으로 정의하고 데이터를 pickle
으로 읽으려고 시도했지만 제대로 작동하지 않았습니다. 또한 데이터 멤버 중 하나가 실제로 다른 구조의 객체를 포함하는 배열 인 것이 적절할 수 있습니다. 이 파일을 읽는 가장 좋은 방법은 무엇입니까?파이썬은 파일로부터 클래스 데이터 멤버를 읽어 들인다.
1
A
답변
0
파이썬의 struct.unpack()
을 사용해야합니다. 그들이 어떤 유형인지 그리고 디스크에 어떻게 포장되어 있는지 정확하게 알아야합니다. pickle
은 파이썬의 저장소 형식에만 해당되며, serialization을 파이썬 특정 항목으로 변환하지 않는 한 어떤 용도로도 사용되지 않습니다.
나는 최근에 당신은 아마 당신이 그것을 초기화 생성자를 가진 클래스를 생성하여 시작할 것 os.read()
보다 편리하게 찾을 수있는 파일로 mmap()
을 사용하는 방법을 보여 주었다 막연하게 비슷한 질문 here 대답 파일 포인터, mmap
개체 및 오프셋의 일부 조합.
그러면 __init___()
메서드는 구조체의 압축을 푼 내용으로 self
의 특성을 읽고 초기화합니다. 그리고 그들 모두 여기에 mmap()
또는 os.write
와 struct.pack
을 사용하여 다시 작성하는 이러한 속성, 다음 save()
방법을 수정하는 접근 방법을 추가하는 것은 포장의 파이썬 문서의 예입니다 세 정수를 풀고 (2 16 비트 반바지는 다음에 32 비트 롱) : 데이터가 가변 길이 ... 당신은 장소에 데이터를 수정할 수 없습니다 것을 의미 할 수있다처럼
>>> from struct import *
>>> pack('=hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('=hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)
>>> calcsize('hhl')
8
소리가 난다.
다음은 os.read()
과 mmap
을 모두 사용하는 Python2 예제입니다. 나는 /tmp/three_numbers.dat
을 dd if=/dev/zero of=/tmp/three_numbers.dat count=1 bs=1k
으로 미리 만들었습니다.
import mmap
import os
import struct
class ThreeNumbers(object):
PACK = '=hhl'
SIZEOF = struct.calcsize(PACK)
def __init__(self, fd, offset):
self._fd = fd
self._offset = offset
self._fd.seek(offset * self.SIZEOF)
self._data = os.read(fd.fileno(), self.SIZEOF)
self.numbers = struct.unpack(self.PACK, self._data)
def save(self):
self._fd.seek(self._offset * self.SIZEOF)
os.write(self._fd.fileno(), struct.pack(self.PACK, *self.numbers))
class ThreeNumbersMMAP(object):
PACK = '=hhl'
SIZEOF = struct.calcsize(PACK)
def __init__(self, mmap, offset):
self._mmap = mmap
self._offset = offset
self._data = mmap[offset * self.SIZEOF:(offset + 1) * self.SIZEOF]
self.numbers = struct.unpack(self.PACK, self._data)
def save(self):
self._mmap[self._offset * self.SIZEOF:(self._offset + 1) * self.SIZEOF] = struct.pack(self.PACK, *self.numbers)
fd = open("/tmp/three_numbers.dat", "rb+")
obj = ThreeNumbers(fd, 0)
print obj.numbers
obj.numbers = (1, 2, 3)
obj.save()
obj = ThreeNumbers(fd, 0)
print obj.numbers
obj.numbers = (0, 0, 0)
obj.save()
mmap = mmap.mmap(fd.fileno(), 0)
obj = ThreeNumbersMMAP(mmap, 0)
print obj.numbers
obj.numbers = (1, 2, 3)
obj.save()
obj = ThreeNumbersMMAP(mmap, 0)
print obj.numbers
obj.numbers = (0, 0, 0)
obj.save()
관련 문제
- 1. Numpy가 '.npy'파일의 데이터를 배열로 직접 읽어 들인다.
- 2. mysqli 준비 문을 배열로 읽어 들인다.
- 3. 사례 클래스 데이터 멤버를 반복합니다.
- 4. 클래스 멤버를 RapidXML 데이터 형식으로 저장
- 5. 다른 클래스의 데이터 멤버를 변경하는 클래스
- 6. 언제 클래스 데이터 멤버를 공개로 선언해야합니까?
- 7. 파이썬은 "클래스"단어 promblem는
- 8. 클래스 함수에서 클래스 데이터 멤버를 기본값으로 사용하기 C++
- 9. JAR 파일로부터 안전 클래스 가져 오기
- 10. 맞춤 클래스 멤버를 입력하고
- 11. Mac에서 Microsoft Access 파일로부터 데이터 가져 오기
- 12. 파이썬은 동적으로 클래스 인스턴스 사이에
- 13. 목록에있는 값을 받아 들인다.
- 14. Python이 새 클래스 멤버를 인식하지 못합니다.
- 15. 파일에서 배열로 데이터 읽어 오기
- 16. Python : 파일에서 데이터 읽어 오기
- 17. 클래스 E의 멤버를 가리키는 클래스 D의 포인터
- 18. 부모 클래스 멤버를 공유하는 하위 클래스
- 19. 클래스 같은 클래스 형의 멤버를 가진
- 20. 클래스 멤버를 속성으로 만들고 합성하기
- 21. 클래스 멤버를 반복하는 방법은 무엇입니까?
- 22. 클래스 멤버를 제외하고 POCO를 직렬화하기
- 23. 클래스 멤버를 JSON 객체로 직렬화하기
- 24. 클래스 또는 생성자에서 멤버를 초기화해야합니까?
- 25. C++ : 클래스 멤버를 정의에 연결
- 26. 정적 클래스 멤버를 가리키는 것
- 27. 클래스 멤버를 열거하는 방법은 없습니까?
- 28. 포인터 멤버를 사용하여 클래스 전달
- 29. 일단 인형에로드되면 클래스 멤버를 변경하십시오.
- 30. 파이썬은 클래스 내에서 클래스를 참조합니다