=> मुझे यह वेब पेज मिला है कि यह जांचने के लिए कि क्या फ़ाइल पाइथन में ftplib का उपयोग कर मौजूद है या नहीं। निम्नलिखित मैंने पाया है (उम्मीद है कि यह किसी की मदद करता है):
=> गैर-मौजूद फ़ाइलों/निर्देशिकाओं को सूचीबद्ध करने का प्रयास करते समय, ftplib एक अपवाद उठाता है। भले ही कोशिश/ब्लॉक को छोड़कर एक मानक अभ्यास और एक अच्छा विचार है, मैं अपने एफ़टीपी स्क्रिप्ट को केवल यह सुनिश्चित करने के बाद फ़ाइल डाउनलोड करने के लिए पसंद करूंगा। यह मेरी स्क्रिप्ट को सरल रखने में मदद करता है - कम से कम जब FTP सर्वर पर निर्देशिका सूचीबद्ध करना संभव है।
उदाहरण के लिए, एडगर एफ़टीपी सर्वर में कई फाइलें हैं जो निर्देशिका/एडगर/दैनिक-अनुक्रमणिका/के अंतर्गत संग्रहीत हैं। प्रत्येक फ़ाइल को "मास्टर.YYYYMMDD.idx" पसंद किया गया है। इस बात की कोई गारंटी नहीं है कि प्रत्येक तारीख (YYYYMMDD) के लिए एक फ़ाइल मौजूद होगी - 24 नवंबर 2013 की कोई फ़ाइल नहीं है, लेकिन दिनांकित एक फ़ाइल है: 22 नवंबर 2013. इन दो मामलों में लिस्टिंग कैसे काम करती है?
# Code
from __future__ import print_function
import ftplib
ftp_client = ftplib.FTP("ftp.sec.gov", "anonymous", "[email protected]")
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131122.idx")
print(resp)
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131124.idx")
print(resp)
# Output
250-Start of list for /edgar/daily-index/master.20131122.idx
modify=20131123030124;perm=adfr;size=301580;type=file;unique=11UAEAA398;
UNIX.group=1;UNIX.mode=0644;UNIX.owner=1019;
/edgar/daily-index/master.20131122.idx
250 End of list
Traceback (most recent call last):
File "", line 10, in <module>
resp = ftp_client.sendcmd("MLST /edgar/daily-index/master.20131124.idx")
File "lib/python2.7/ftplib.py", line 244, in sendcmd
return self.getresp()
File "lib/python2.7/ftplib.py", line 219, in getresp
raise error_perm, resp
ftplib.error_perm: 550 '/edgar/daily-index/master.20131124.idx' cannot be listed
जैसा कि अपेक्षित है, एक गैर-मौजूद फ़ाइल सूचीबद्ध करना अपवाद उत्पन्न करता है।
=> के बाद से मैं जानता हूँ कि एडगर FTP सर्वर निश्चित रूप से निर्देशिका होगा/एडगर/दैनिक सूचकांक /, मेरी स्क्रिप्ट न के बराबर फाइलों की वजह से अपवादों को ऊपर उठाने से बचने के लिए निम्न कर सकते हैं:
क) इस सूची निर्देशिका।
बी) यदि आवश्यक हो तो आवश्यक फ़ाइल डाउनलोड करें यदि वे इस लिस्टिंग में मौजूद हैं - लिस्टिंग की जांच करने के लिए मैं आम तौर पर लिस्टिंग ऑपरेशन लौटने वाली तारों की सूची पर एक regexp खोज करता हूं।
उदाहरण के लिए यह स्क्रिप्ट पिछले तीन दिनों से फ़ाइलों को डाउनलोड करने का प्रयास करती है। अगर किसी निश्चित तारीख के लिए कोई फ़ाइल पाई जाती है तो यह डाउनलोड हो जाती है, और कुछ भी नहीं होता है।
import ftplib
import re
from datetime import date, timedelta
ftp_client = ftplib.FTP("ftp.sec.gov", "anonymous", "[email protected]")
listing = []
# List the directory and store each directory entry as a string in an array
ftp_client.retrlines("LIST /edgar/daily-index", listing.append)
# go back 1,2 and 3 days
for diff in [1,2,3]:
today = (date.today() - timedelta(days=diff)).strftime("%Y%m%d")
month = (date.today() - timedelta(days=diff)).strftime("%Y_%m")
# the absolute path of the file we want to download - if it indeed exists
file_path = "/edgar/daily-index/master.%(date)s.idx" % { "date": today }
# create a regex to match the file's name
pattern = re.compile("master.%(date)s.idx" % { "date": today })
# filter out elements from the listing that match the pattern
found = filter(lambda x: re.search(pattern, x) != None, listing)
if(len(found) > 0):
ftp_client.retrbinary(
"RETR %(file_path)s" % { "file_path": file_path },
open(
'./edgar/daily-index/%(month)s/master.%(date)s.idx' % {
"date": today
}, 'wb'
).write
)
=> दिलचस्प बात यह है कि ऐसी स्थितियां हैं जहां हम FTP सर्वर पर निर्देशिका सूचीबद्ध नहीं कर सकते हैं। एडगर एफ़टीपी सर्वर, उदाहरण के लिए,/edgar/डेटा पर लिस्टिंग को अस्वीकार करता है क्योंकि इसमें बहुत अधिक उप-निर्देशिकाएं हैं। ऐसे मामलों में, मैं यहां वर्णित "अस्तित्व की सूची और जांच" दृष्टिकोण का उपयोग नहीं कर पाऊंगा - इन मामलों में मुझे गैर-मौजूद फ़ाइल/निर्देशिका पहुंच प्रयासों से पुनर्प्राप्त करने के लिए अपने डाउनलोडर स्क्रिप्ट में अपवाद हैंडलिंग का उपयोग करना होगा।
यह आपको नहीं बताएगा कि * public_html' नामक एक * फ़ाइल * (निर्देशिका के बजाय) है या नहीं। –
नहीं तो किसी भी ("public_html" filelist में च के लिए च में): प्रिंट "नहीं public_html" और : # कुछ करना या: सार्वजनिक = [च filelist में च के लिए करता है, तो "public_html" च में] नहीं तो जनता: प्रिंट "नहीं public_html" और : सार्वजनिक रूप से च के लिए : # बजाय कमांड "सूची" है, जो एक लाइन प्रत्येक फ़ाइल के बारे में जानकारी से भरा रिटर्न भेजकर और फिर परीक्षण के बारे में कुछ – hughdbrown
करो 'अगर फ़ाइल नाम एफ में, आप "एनएलएसटी" कमांड भेज सकते हैं, जो सिर्फ प्रत्येक फ़ाइल के लिए फ़ाइल नाम देता है। Http://docs.python.org/library/ftplib.html#ftplib.FTP.retrlines –