多次下载- CSV文件

vwoqyblh  于 2022-12-25  发布在  其他
关注(0)|答案(2)|浏览(199)

我有一个脚本,如下所示,它可以从1只CSV文件的特定行下载文件。我没有问题,它运行良好,所有文件都下载到我的'Python项目'文件夹,根。
但是我想在这里添加一些功能,首先,下载不仅仅是1个而是多个(20个或更多)CSV文件,这样我就不必在这里手动更改名称- open('name 1. csv') 每次我的脚本完成这项工作。第二个请求,下载需要放在一个文件夹中,与下载的csv文件同名。希望我足够清楚:)
那我就可以:

  • 名称1.csv-〉名称1文件夹-〉从名称1 csv下载
  • 名称2.csv-〉名称2文件夹-〉从名称2 csv下载
  • 名称3.csv-〉名称3文件夹-〉从名称3 csv下载
  • ...

任何帮助或建议将不胜感激:)非常感谢!

from collections import Counter
import urllib.request
import csv
import os

with open('name1.csv') as csvfile:  #need to add multiple .csv files here.
    reader = csv.DictReader(csvfile)
    title_counts = Counter()
    
    for row in reader:
        name, ext = os.path.splitext(row['link'])
        title = row['title']
        title_counts[title] += 1
        title_filename = f"{title}_{title_counts[title]}{ext}".replace('/', '-') #need to create a folder for each CSV file with the download inside.
        urllib.request.urlretrieve(row['link'], title_filename)
ftf50wuq

ftf50wuq1#

您需要添加一个外部循环,该循环将遍历特定文件夹中的文件。您可以使用os.listdir()返回所有条目的列表,也可以使用glob.iglob()*.csv模式仅获取扩展名为.csv的文件。
此外,您还可以在代码中进行一些小的改进。您使用Counter的方式是,它可以被替换为defaultdict,甚至简单的dict。此外,urllib.request.urlretrieve()是遗留接口的一部分,可能会被弃用,因此您可以将其替换为urllib.request.urlopen()shutil.copyfileobj()的组合。
最后,要创建一个文件夹,您可以使用os.mkdir(),但以前您需要使用os.path.isdir()检查文件夹是否已经存在,这是防止FileExistsError异常所必需的。
完整代码:

from os import mkdir
from os.path import join, splitext, isdir
from glob import iglob
from csv import DictReader
from collections import defaultdict
from urllib.request import urlopen
from shutil import copyfileobj

csv_folder = r"/some/path"
glob_pattern = "*.csv"
for file in iglob(join(csv_folder, glob_pattern)):
    with open(file) as csv_file:
        reader = DictReader(csv_file)
        save_folder, _ = splitext(file)
        if not isdir(save_folder):
            mkdir(save_folder)
        title_counter = defaultdict(int)
        for row in reader:
            url = row["link"]
            title = row["title"]
            title_counter[title] += 1
            _, ext = splitext(url)
            save_filename = join(save_folder, f"{title}_{title_counter[title]}{ext}")
            with urlopen(url) as req, open(save_filename, "wb") as save_file:
                copyfileobj(req, save_file)
fzwojiic

fzwojiic2#

For 1:循环遍历一个包含你想要的文件名的列表,这个列表可以用“os.listdir(path)”来检索,它返回一个包含在你的“path”中的文件列表(在你的例子中是一个包含csv文件的文件夹)。

相关问题