根据输入列表下载文件 Python
我正在尝试根据给定的列表下载文件。我的脚本本来运行得很好。但是,我遇到了一个问题。它只下载了第一个文件,没有遍历整个列表。我对代码做了一些修改,现在它把列表中的所有元素都当成了一个元素,结果返回了一个错误,提示说找不到文件或目录,像这样:'没有这样的文件或目录 data\item1\nitem2\nitem3\nitem4\nitem5.txt' 这是我代码中解析输入列表的部分。
def get_data(name):
file_name = os.path.join("data", name + ".txt")
if not os.path.exists(file_name):
sys.exit(-1)
inF = open(file_name, "r")
lines = inF.readlines()
data = ''.join(lines)
return data
编辑:
def download_final_data_for_data(data):
url = "http://www.example.com/"+ data
url_file = urlopen(url)
soup = BeautifulSoup(url_file)
soup1 = str(soup)
pattern=re.compile(r'''>final_data(.*?)</a>''')
data = pattern.findall(soup1)
final_data_number = ''.join(data)
return final_data_number
def get_data(name):
data_list = []
file_name = os.path.join("data", name + ".txt")
if not os.path.exists(file_name):
sys.exit(-1)
inF = open(file_name, "r")
lines = inF.readlines()
for line in lines:
data = line.strip()
if len(data) > 1:
data_list.append(data)
else:
data_list.append(sys.argv[1])
return data_list
5 个回答
因为你的问题表述得不太清楚,我来给你展示一下我解决这个任务的基本思路。
你可以使用argparse这个工具来告诉程序使用特定的文件作为链接列表。
下面的代码中,argparse提供了一个命令行界面,你可以这样调用它。
python ./script.py -i list.txt -o ./
这个命令是用来把所有内容下载到当前目录(注意,这个功能还没有实现)。
或者你也可以通过一堆文件来使用,比如:
python ./script.py -i lists/* -o ./
import argparse
def parseList(file): # Parse the file, remove newlines/empty lines
with open(file, 'r') as f:
lines = [line.strip() for line in f if line.strip()]
return lines
def downloadLinks(links, output): # DOWNLOAD ALL THE LINKS!
for link in links:
print("Download me: %s" % link)
if __name__ == '__main__':
ap = argparse.ArgumentParser('File Downloader')
ap.add_argument('-i','--input',nargs='+', required=True, help='Path to the download list')
ap.add_argument('-o','--output',required=True, help='Path to the output directory')
args = vars(ap.parse_args())
for file in args['input']: # loop over all input files and process them
parsedList = parseList(file)
downloadLinks(parsedList, args['output'])
我猜你是在把一个字符串传给get_data(),否则你会遇到连接错误。如果真是这样的话,你在错误信息中看到的文件名包含换行符,而你在方法的最后把所有东西都连接在一起,所以我猜你是在把文件中的所有内容都连接起来。不过,我不能确定这一点,因为我不知道'name'是什么。
如果你真的是这样做的,我建议你使用file.readlines(),然后把结果传给get_data。这样写可能会像下面这样:
for name in file.readlines():
data = get_data(name)
否则,如果你出于某种原因需要把所有内容读成一个字符串,你可以试试:
names = name.split('\n')
for name in names:
data = get_data(name)
很难在没有更多上下文和具体示例输入的情况下给出答案,但看起来 name
里可能包含类似 item1\nitem2\nitem3\nitem4\nitem5
的内容。你有没有打印出来检查一下呢?
我注意到你把 lines
合并成了一个字符串 data
。如果你对参数 name
也这样做的话,我会期待看到你所描述的那种情况。
我猜你可能想做的事情是这样的:
for fn in name:
get_data(fn.strip()) # strip off possible trailing \n
但不要先把 name
合并。如果 name
已经是你描述的那种字符串,那么你需要做类似这样的事情:
name = name.split('\n')
for fn in name:
get_data(fn)
在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有些地方不太对劲,或者是我们没有正确理解某些概念。
当你在写代码时,可能会用到一些特定的工具或者库,这些工具可以帮助你更方便地完成任务。但是,如果你对这些工具不太了解,就可能会在使用的时候遇到困难。
有时候,解决问题的方法就是仔细检查你的代码,看看有没有拼写错误,或者是逻辑上是否有问题。你也可以查阅一些资料,看看别人是怎么解决类似的问题的。
总之,编程是一门需要不断学习和实践的技能,遇到问题时不要气馁,慢慢来,总会找到解决办法的。
for name in namelist.split('\\'):
data = get_data(name)
我明白问题出在哪里了。问题的部分是:
file_name = os.path.join("data", name + ".txt")
为了获取正确的文件名,你需要以某种方式遍历这些名字。为了在读取名字时(以及它们在代码中现在的样子)得到一个名字的列表,你可以使用一个
namelist = name.split("/n") #this gives you a list that you can work on.
#alternatively read the file line-by-line (which you don't at the moment)
你的代码实际上是在把包含“data”的字符串、你读取的所有名字和换行符连接在一起,并加上“.txt”的后缀。无论如何,接下来只需要做一个
for name in namelist:
#do stuff with name
file_name = os.path.join("data",name+".txt")
....