根据输入列表Python下载文件

时间:2014-09-08 18:16:27

标签: python list file parsing download

我正在尝试根据给定列表下载文件。我的脚本对我来说很好。但是,我有一个问题。它只下载第一个。它不会遍历列表。我已经修改了一些代码,现在它正在考虑列表中的所有元素是一个元素,并返回一个错误,说“没有这样的文件或目录数据\ 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 个答案:

答案 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'])