2008-11-12 22 views
5

Tôi có một ứng dụng nhập dữ liệu từ một tệp được nén. Nó hoạt động tốt trong Windows nhưng hành vi của Mac và Linux là lạ.Tệp đã được tải xuống sẽ không tải trên Mac/Linux

Trong OS X, tệp được nhúng (đuôi tệp ".char") không khả dụng dưới dạng lựa chọn trừ khi tôi đặt loại tệp thành *. *. Sau đó, nếu tôi chọn tệp có phần mở rộng .char, nó sẽ không tải, đưa ra lỗi

unpickle_file = cPickle.load(char_file) 

ValueError: could not convert string to float

Tuy nhiên, nếu tôi tạo tệp không có đuôi .char, tệp đó sẽ tải lên tốt.

Trong Linux, khi tôi sử dụng hộp thoại "mở tệp", các tệp đã được chọn của tôi không hiển thị, cho dù chúng có mở rộng tệp hay không. Tuy nhiên, tôi có thể nhìn thấy chúng dưới Nautilus hoặc Dolphin. Họ chỉ đơn giản là không tồn tại cho ứng dụng của tôi mặc dù.


Sửa Dưới đây là mã tiết kiệm:

def createSaveFile(self): 
     """Create the data files to be saved and save them. 

     Creates a tuple comprised of a dictionary of general character information 
     and the character's skills dictionary.""" 
     if self.file_name: 
      self.save_data = ({'Name':self.charAttribs.name, 

       <snip> 

       self.charAttribs.char_skills_dict) 
      self.file = open(self.file_name, 'w') 
      cPickle.dump(self.save_data, self.file) 
     self.file.close() 

Dưới đây là mã mở:

def getCharFile(self, event): # wxGlade: CharSheet.<event_handler> 
     """Retrieve pickled character file from disk.""" 
     wildcard = "Character files (*.char) | *.char | All files (*.*) | *.*"   
     openDialog = wx.FileDialog(None, "Choose a character file", os.getcwd(), 
     "", wildcard, wx.OPEN | wx.CHANGE_DIR) 
     if openDialog.ShowModal() == wx.ID_OK: 
      self.path = openDialog.GetPath() 
     try: 
      char_file = open(self.path, "r") 
      unpickle_file = cPickle.load(char_file) 
      char_data, char_skills = unpickle_file 
      self.displayCharacter(char_data, char_skills) 
     except IOError: 
      self.importError = wx.MessageDialog(self, 
      "The character file is not available!", 
      "Character Import Error", wx.OK | wx.ICON_ERROR) 
      self.importError.ShowModal() 
      self.importError.Destroy() 
      openDialog.Destroy() 
+0

một "tập ngâm" là gì? –

+0

Một tệp được tạo bằng mô-đun dưa (http://docs.python.org/library/pickle.html#module-pickle), một mô-đun được sử dụng để tuần tự hóa và deserialize cấu trúc dữ liệu. –

Trả lời

10

Có lẽ bạn đã không mở tập tin trong chế độ nhị phân khi viết và/hoặc đọc dữ liệu đã chọn. Trong trường hợp này chuyển đổi định dạng dòng mới sẽ xảy ra, có thể phá vỡ dữ liệu nhị phân.

Để mở một tập tin trong chế độ nhị phân, bạn phải cung cấp "b" như là một phần của chuỗi chế độ:

char_file = open('pickle.char', 'rb') 
+1

Tôi không nghĩ rằng điều này sẽ giúp, như trong chế độ văn bản Linux là giống như nhị phân anyway. \ R \ 's đã có mặt, do đó, vấn đề sẽ thực sự cần phải được cố định về tiết kiệm (mặc dù mở trong chế độ dòng mới phổ quát có thể làm việc xung quanh nó.) – Brian

+0

Bây giờ mở đã được đăng, cảm thấy tự do để thay đổi "có lẽ" để "chắc chắn ". –

8

Như đã đề cập bởi Adam, vấn đề có khả năng là định dạng xuống dòng của file dưa .

Thật không may, vấn đề thực sự thực sự gây ra trên lưu thay vì tải. Điều này có thể được phục hồi nếu bạn đang sử dụng dưa chua chế độ văn bản, thay vì nhị phân. Thử mở file trong chế độ xuống dòng phổ thông, mà sẽ gây trăn đoán những gì quyền dòng kết thúc là ví dụ:

char_file=open('filename.char','rU') 

Tuy nhiên, nếu bạn đang sử dụng một định dạng nhị phân (cPickle.dump (file, 1) Bạn có thể có một đĩa dưa không thể phục hồi (ngay cả khi tải trong Windows) - nếu bạn may mắn và không có nhân vật nào xuất hiện thì nó có thể hoạt động, nhưng ngay khi điều này xảy ra, bạn có thể bị hỏng dữ liệu, không có cách nào để phân biệt giữa mã "thực" \ r \ n và một cửa sổ đã được chèn vào khi chỉ thấy \ n.

Cách tốt nhất để xử lý mọi thứ được tải trong nhiều nền tảng là luôn luôn lưu ở chế độ nhị phân. Trên máy tính của cửa sổ của bạn, khi tiết kiệm việc sử dụng dưa:

char_file = open('filename.char','wb') 
cPickle.dumps(data, char_file) 
2
self.file = open(self.file_name, 'w')

nên là:

self.file = open(self.file_name, 'wb')

Trong chức năng createSaveFile của bạn, để lưu các tập tin trong chế độ nhị phân (chứ không phải chế độ văn bản). Bạn cũng nên chắc chắn rằng bạn mở tập tin trong chế độ nhị phân là tốt (rb).

Nếu bạn không sử dụng chế độ nhị phân thì Windows sẽ chuyển đổi tất cả các dòng mới thành \ r \ n và sẽ làm hỏng tệp một cách hiệu quả (ít nhất là các hệ điều hành khác có liên quan).

4

Cách khác để nhận lỗi này là quên đóng tệp xuất sau khi tẩy. Điều này có thể để lại một tệp không hoàn chỉnh không thành công theo cách ngẫu nhiên trong lần bỏ ghim tiếp theo.

0

Sử dụng công cụ dos2unix

dos2unix pickle.char 
Các vấn đề liên quan