根据输入列表下载文件 Python

3 投票
5 回答
2330 浏览
提问于 2025-04-20 12:33

我正在尝试根据给定的列表下载文件。我的脚本本来运行得很好。但是,我遇到了一个问题。它只下载了第一个文件,没有遍历整个列表。我对代码做了一些修改,现在它把列表中的所有元素都当成了一个元素,结果返回了一个错误,提示说找不到文件或目录,像这样:'没有这样的文件或目录 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 个回答

2

因为你的问题表述得不太清楚,我来给你展示一下我解决这个任务的基本思路。

你可以使用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'])
2

我猜你是在把一个字符串传给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)
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)
2

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这些问题可能是因为我们写的代码有些地方不太对劲,或者是我们没有正确理解某些概念。

当你在写代码时,可能会用到一些特定的工具或者库,这些工具可以帮助你更方便地完成任务。但是,如果你对这些工具不太了解,就可能会在使用的时候遇到困难。

有时候,解决问题的方法就是仔细检查你的代码,看看有没有拼写错误,或者是逻辑上是否有问题。你也可以查阅一些资料,看看别人是怎么解决类似的问题的。

总之,编程是一门需要不断学习和实践的技能,遇到问题时不要气馁,慢慢来,总会找到解决办法的。

for name in namelist.split('\\'):
    data = get_data(name)
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)

你的代码实际上是在把包含“data”的字符串、你读取的所有名字和换行符连接在一起,并加上“.txt”的后缀。无论如何,接下来只需要做一个

for name in namelist:
    #do stuff with name
    file_name = os.path.join("data",name+".txt")
    ....

撰写回答