簡體   English   中英

多次下載 - CSV 文件

[英]Multiple download - CSV file

我在下面有一個腳本,它可以從1 only CSV file的特定行下載文件。 我沒有問題,它運行良好,所有文件都下載到我的“Python 項目”文件夾根目錄中。

但我想在這里添加功能,首先,不僅要下載 1 個,還要下載多個(20 個或更多)CSV 文件,然后我不必在此處手動更改名稱 - open(' name1 .csv')每次我的腳本完成時工作。 第二個請求,下載需要放在與下載來自的 csv 文件同名的文件夾中。 希望我足夠清楚:)

然后我可以:

  • name1.csv -> name1 文件夾 -> 從 name1 csv 下載
  • name2.csv -> name2 文件夾 -> 從 name2 csv 下載
  • name3.csv -> name3 文件夾 -> 從 name3 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)

您需要添加一個外循環,它將遍歷特定文件夾中的文件。 您可以使用返回所有條目列表的os.listdir()或帶有*.csv模式的glob.iglob()來僅獲取擴展名為.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)

對於 1:只需遍歷包含所需文件名稱的列表。 可以使用“os.listdir(path)”檢索該列表,它返回包含在您的“路徑”(在您的案例中包含 csv 文件的文件夾)中的文件列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM