2015-05-05 5 views
7

मैं इसे requests का उपयोग करके सीधे फ़ाइल में डाउनलोड करना चाहता हूं ताकि इसे सीधे PyPDF2 पाठक को डिस्क पर लिखने से बचा जा सके, लेकिन पाठक मैं यह नहीं समझ सकता कि इसे file object के रूप में कैसे पास किया जाए। यहाँ मैं क्या करने की कोशिश की है या नहीं:अनुरोध: यूआरएल से लौटें फ़ाइल ऑब्जेक्ट (जैसे ओपन ('', 'आरबी'))

import requests as req 
from PyPDF2 import PdfFileReader 

r_file = req.get('http://www.location.come/somefile.pdf') 
rs_file = req.get('http://www.location.come/somefile.pdf', stream=True) 

with open('/location/somefile.pdf', 'wb') as f: 
    for chunk in r_file.iter_content(): 
     f.write(chunk) 

local_file = open('/location/somefile.pdf', 'rb') 

#Works: 
pdf = PdfFileReader(local_file) 

#As expected, these don't work: 
pdf = PdfFileReader(rs_file) 
pdf = PdfFileReader(r_file) 
pdf = PdfFileReader(rs_file.content) 
pdf = PdfFileReader(r_file.content) 
pdf = PdfFileReader(rs_file.raw) 
pdf = PdfFileReader(r_file.raw) 

उत्तर

13

requests बारे में कुछ पता करने के लिए बिना, आप हमेशा कुछ भी से बाहर एक फ़ाइल जैसी वस्तु बना सकते हैं आप एक स्ट्रिंग StringIO का उपयोग कर के रूप में स्मृति में है।

विशेष रूप से:

  • अजगर 2 StringIO.StringIO(s) एक बाइनरी फ़ाइल है।
  • पायथन 2 cStringIO.StringIO(s) समान है, लेकिन संभवतः अधिक कुशल है।
  • पायथन 3 io.BytesIO(b) एक बाइनरी फ़ाइल है (bytes से निर्मित)।
  • पायथन 3 io.StringIO(s) एक यूनिकोड टेक्स्ट फ़ाइल है।
  • पायथन 2 io.BytesIO(s) एक बाइनरी फ़ाइल है।
  • पायथन 2 io.StringIO(u) एक यूनिकोड टेक्स्ट फ़ाइल है (unicode से निर्मित)।

(पहले दो "बाइनरी" अजगर 2 अर्थ में कर रहे हैं - कोई रेखा न खत्म होने वाली रूपांतरण दूसरों "बाइनरी" बनाम अजगर 3 अर्थ में "पाठ" कर रहे हैं -। बाइट्स बनाम यूनिकोड।)

तो, io.BytesIO(response.content) आपको पाइथन 2 और पायथन 3 दोनों में एक वैध बाइनरी फ़ाइल-जैसी वस्तु देता है। यदि आप केवल पाइथन 2, cStringIO.StringIO(response.content) पर अधिक कुशल हो सकते हैं।

बेशक "फ़ाइल की तरह" केवल इतना ही चला जाता है; यदि लाइब्रेरी की कोशिश करता है, उदाहरण के लिए, fileno विधि पर कॉल करें और फ़ाइल डिस्क्रिप्टर के खिलाफ सी कॉल करना प्रारंभ करें, यह काम नहीं करेगा। लेकिन 99% समय, यह काम करता है।

+0

अच्छा काम करता है। धन्यवाद। – TimY

+0

इस अच्छा, संक्षिप्त जवाब बंपिंग। मैंने सोचा, @ बार्नर्ट, क्या कोई ऐसा संसाधन है जो स्ट्रिंगियो ऑब्जेक्ट्स में कौन सी फाइल-जैसी ऑब्जेक्ट विधियां उपलब्ध नहीं है? – ghukill

संबंधित मुद्दे