从URL格式下载csv:https://.../%Y%m%d.csv 在一段时间内使用Python

从URL格式下载csv:https://.../%Y%m%d.csv 在一段时间内使用Python,python,csv,download,Python,Csv,Download,我是python新手,需要一些帮助 我正在从下载数据 我可以使用以下代码下载一个文件: import requests import shutil r = requests.get('https://.../..._20200110.csv', stream=True) if r.status_code == 200: with open("20200110.csv", 'wb') as f: r.raw.decode_content = True shu

我是python新手,需要一些帮助

我正在从下载数据

我可以使用以下代码下载一个文件:

import requests
import shutil
r = requests.get('https://.../..._20200110.csv', stream=True)
if r.status_code == 200:
    with open("20200110.csv", 'wb') as f:
        r.raw.decode_content = True
        shutil.copyfileobj(r.raw, f)

如何将数据从20190131下载到20200102?

正如AMC评论的那样,您的答案在于字符串格式的漫游,例如使用f-strings python>3.6

此外,您还需要循环日期,同时计算当月的天数。因此,您需要将日期字符串转换为某种可以计算的日期对象,例如datetime

为了帮助您开始:下面的代码应该满足您的要求。如果找不到文件,您可能需要添加一些逻辑/反馈

import requests
import shutil
from datetime import datetime, timedelta

# enter start/end dates here, convert to datetime object
start_date = datetime.strptime('2009-10-31', '%Y-%m-%d')  # the latter arg defines the format of the given string
end_date = datetime.strptime('2011-01-02', '%Y-%m-%d')

# need to know how many days we need to loop over
day_count = (end_date - start_date).days + 1

# loop over days and download file
for i in range(day_count):
    date_str = (start_date + timedelta(i)).strftime('%Y%m%d')  # convert our datetime obj into the desired string format
    r = requests.get(f'https://www.tfx.co.jp/publication/document/daily_statis_{date_str}.csv', stream=True)
    if r.status_code == 200:
        with open(f'{date_str}.csv', 'wb') as f:
            r.raw.decode_content = True
            shutil.copyfileobj(r.raw, f)

下面是一个完整的解决方案,它似乎正确地处理了编码:

导入日期时间 导入请求 日期=datetime.datetime2020,1,5+范围10内偏移量的datetime.timedeltaoffset 带请求。会话作为请求: 对于日期中的当前日期: 日期\u str=curr\u date.strftime“%Y%m%d” 当前url=fhttps://www.tfx.co.jp/publication/document/daily_statis_{date_str}.csv 对于req_sess.getcurr_url,stream=True作为req: 如果请求状态\ U代码==200: req.encoding='shift jis' 使用openf“../out/{date\u str}.csv”、“w”作为out\u文件: out_file.writereq.text
如果有什么不清楚的地方,请告诉我

这里有一个基于f-strings和pathlib的替代版本。它需要Python 3.6+,但由于f字符串:

导入请求 从pathlib导入路径 从datetime导入datetime,timedelta start=datetime.strtime'20091031','%Y%m%d' end=datetime.strtime'20110102','%Y%m%d' 天数=结束-开始。天数+1 日期=开始时间+时间增量。strftime“%Y%m%d”,用于以天为单位的 csvdir=路径“/dir/to/save/files/in” 对于日期中的日期: csvfile=f'daily_statis_u{date}.csv' url=f'https://www.tfx.co.jp/publication/document/{csvfile}' printf'正在请求:{csvfile}' r=requests.geturl,stream=True 如果r.ok: printf'Writing{csvdir/csvfile}' csvdir/csvfile.write_textr.text 其他: printf'请求{csvfile}时出错:状态代码{r.status\u code}'
到底是什么问题?更改url中的日期无效吗?我不知道如何使用代码来更改日期,而不是手动更改。您正在努力完成此过程的哪一部分?如何将url中的日期更改为链接。我想下载一段时间的csv文件,例如表格20090110到20110321。但我不知道如何编写代码。我知道,我的意思是,以编程方式生成/修改url的哪一部分会给您带来麻烦?谢谢。有什么不对劲吗?使用这个,我只得到一个名为“date\u str”的csv文件。我能在一天之内得到csv文件吗?这正是我想要的。非常感谢。我在语句“with openf'date_str.csv”,“wb'as f:”中为date_str添加了“{}”,问题得到了解决。很好的捕获,f字符串确实需要变量周围有{}。编辑了我的答案。@Helloworld,如果可能,将其中一个答案标记为已接受。这将有助于其他人回答同样的问题和答案的作者。