根据文件是不是已经存在以及是不是有用于它们的文件夹来下载文件 Python
Posted
技术标签:
【中文标题】根据文件是不是已经存在以及是不是有用于它们的文件夹来下载文件 Python【英文标题】:Downloading files based on if they already exist and if there is a folder for them Python根据文件是否已经存在以及是否有用于它们的文件夹来下载文件 Python 【发布时间】:2017-08-16 05:45:31 【问题描述】:我正在尝试创建一个从 FTP 站点下载文件的脚本,具体取决于我是否有一个文件夹可以将它们放入(基于日期代码)以及我是否已经下载了文件并将其保存在该文件夹中.我相信我有能力做到这一点,但是我不确定如何将它们结合起来才能发挥作用。
到目前为止,要从 FTP 服务器下载文件,我有以下代码。
from ftplib import FTP
import os, sys, os.path
import re
def handleDownload(block):
file.write(block)
ddir='U:/Test Folder'
os.chdir(ddir)
ftp = FTP('sidads.colorado.edu')
ftp.login()
print ('Logging in.')
directory = '/pub/DATASETS/NOAA/G02158/unmasked/2012/04_Apr/'
print ('Changing to ' + directory)
ftp.cwd(directory)
ftp.retrlines('LIST')
print ('Accessing files')
filenames = ftp.nlst() # get filenames within the directory
print (filenames)
for filename in filenames:
if filename not in ['.', '..']:
local_filename = os.path.join(ddir, filename)
print(filename)
with open(local_filename, 'wb') as f_output:
ftp.retrbinary('RETR '+ filename, f_output.write)
ftp.quit()
要从文件名中提取我需要的字符串值并使用这些字符串值来确定将它们放入的文件夹是否存在以及文件是否存在,我使用了以下代码。 (重要的一点是,从我下载的文件名中提取的字符串值与我在文件路径中使用的代码匹配,因此允许我匹配它们)
for fname in filenames:
tl = fname[16:20]
t2 = fname[20:22]
t3 = fname[22:24]
if not tl: continue
print (tl) # You can append the result to a list
print (t2) # You can append the result to a list
print (t3) # You can append the result to a list
if os.path.exists(os.path.join("U:/SWEModelConstruction/UnmaskedData/",t1,t2,t3)) == true and os.path.isfile("U:/SWEModelConstruction/UnmaskedData/",t1,t2,t3,filename) != true
【问题讨论】:
如果文件夹结构不存在,您需要创建一个还是忽略该文件? 忽略文件 基本上,您将dirr
加入您的文件名以形成local_filename,然后在第二个sn-p 中,您使用不同的路径。那么哪条路是正确的呢?第一个 sn-p 中的那个只是一个样本,另一个是正确的吗
第一个 sn-p 中的路径只是一个临时位置,我的最终目标是让脚本将文件下载到第二个 sn-p 中的文件路径中,当且仅当已经有一个文件夹,并且我还没有下载的文件已经下载到该文件夹中。很抱歉这个令人困惑的问题,感谢您的帮助。
答案有帮助吗?
【参考方案1】:
按照你的方法,
def check_path(fname):
tl = fname[16:20]
t2 = fname[20:22]
t3 = fname[22:24]
if not tl: continue
if os.path.exists(os.path.join(dirr,t1,t2,t3)) == true and os.path.isfile(dirr,t1,t2,t3,filename) != true
for filename in filenames:
if filename not in ['.', '..']:
check_path(filename)
local_filename = os.path.join(ddir, filename)
print(filename)
with open(local_filename, 'wb') as f_output:
ftp.retrbinary('RETR '+ filename, f_output.write)
你基本上需要检查路径是否可用,如果没有制作目录。
然后,如果文件存在使用os.path.isfile()
并且可以以更简单的方式完成,如(使事情更普遍)
def check_path(path):
if not os.path.exists(path):
return False
return True
for filename in filenames:
if filename not in ['.', '..']:
local_filename = os.path.join(ddir, filename)
path='/'.join(local_filename.split('/')[:-1])
# check if dir exists otherwise create one
# wrtie files that doesnt exists
if os.path.exists(path) and not os.path.isfile(filename):
with open(local_filename, 'wb') as f_output:
ftp.retrbinary('RETR '+ filename, f_output.write)
希望对你有帮助!
【讨论】:
以上是关于根据文件是不是已经存在以及是不是有用于它们的文件夹来下载文件 Python的主要内容,如果未能解决你的问题,请参考以下文章