2009-12-09 15 views
15

Tôi đang làm việc với tệp được tải lên bằng cách sử dụng số forms.FileField của Django. Điều này trả về một đối tượng thuộc loại InMemoryUploadedFile.Tôi làm cách nào để truy cập tệp được tải lên ở chế độ toàn cầu mới?

Tôi cần truy cập tệp này ở chế độ toàn cầu mới. Bất kỳ ý tưởng nào về cách thực hiện điều này mà không lưu và sau đó mở lại tệp?

Cảm ơn

Trả lời

14

Nếu bạn đang sử dụng Python 2.6 hoặc cao hơn, bạn có thể sử dụng lớp io.StringIO sau khi đọc tập tin của bạn vào bộ nhớ (bằng cách sử dụng phương pháp read()). Ví dụ:

>>> import io 
>>> s = u"a\r\nb\nc\rd" 
>>> sio = io.StringIO(s, newline=None) 
>>> sio.readlines() 
[u'a\n', u'b\n', u'c\n', u'd'] 

Để thực sự sử dụng này theo quan điểm django, bạn có thể cần phải chuyển đổi các tập tin dữ liệu đầu vào cho unicode:

stream = io.StringIO(unicode(request.FILES['foo'].read()), newline=None) 
+0

này hoạt động tuyệt vời. Tôi sử dụng nó cùng với csv.DictReader trong chế độ xem django của tôi. 'reader = csv.DictReader (stream)' rồi 'cho hàng trong trình đọc: #import each row' Bất kỳ suy nghĩ nào về việc này sẽ làm gì với việc sử dụng bộ nhớ? Tôi đang trên một 'ngân sách' :) Tôi biết tôi nên có lẽ chỉ cần lưu các tập tin ở một vị trí tạm thời nhưng tôi tò mò nếu cho thời gian này tôi cần phải làm bất kỳ rác giống như làm sạch? – teewuane

Các vấn đề liên quan