我正在尝试根据给定列表下载文件。我的脚本对我来说很好。但是,我有一个问题。它只下载第一个。它不会遍历列表。我已经修改了一些代码,现在它正在考虑列表中的所有元素是一个元素,并返回一个错误,说“没有这样的文件或目录数据\ 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
答案 0 :(得分:2)
如果没有看到更多上下文和具体的示例输入,很难说,但看起来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)
答案 1 :(得分:2)
for name in namelist.split('\\'):
data = get_data(name)
答案 2 :(得分:2)
我假设您将字符串传递给get_data(),否则会出现连接错误。如果是这种情况,由于您在错误中得到的文件名包括换行符,并且您在方法结束时加入了所有内容,我猜您正在加入文件的全部输入。但是,我不能确定没有看到“名字”是什么。
如果你正在做的事情,我建议使用 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)
答案 3 :(得分:2)
我知道问题出在哪里。有问题的部分是:
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)
你的代码所做的是加入包含&#34;数据&#34;的字符串。 ,您使用换行符和&#34; .txt&#34;读取的所有名称;后缀。无论如何,那就做一个
for name in namelist:
#do stuff with name
file_name = os.path.join("data",name+".txt")
....
答案 4 :(得分:2)
由于你的陈述不是很清楚,我会试着展示我解决这个问题的方法的骨架。
您可以使用argparse告诉程序将某些文件用作链接列表。
Argparse在下面的脚本中提供了一个CLI接口,您可以像这样调用它。
python ./script.py -i list.txt -o ./
将所有内容下载到currenty directoy(注意这没有实现)
或者通过使用一堆文件
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'])