Загрузите файл .txt и извлеките имя файла

#python #pandas #download #python-requests

#python #панды #Скачать #python-запросы

Вопрос:

Я пытаюсь загрузить файл на Python с URL-адреса https://marketdata.theocc.com/position-limits?reportType=change .

Я могу преобразовать его в DataFrame, просто используя:

 df = pd.read_csv('https://marketdata.theocc.com/position-limits?reportType=change')
 

Но то, что я хочу, — это также получить имя файла.
итак, если вы загружаете файл непосредственно из браузера, имя полученного файла будет «POSITIONLIMITCHANGE_20201202.txt «.

Может кто-нибудь предложить эффективный способ сделать это на Python? Спасибо.

Ответ №1:

если вы используете requests библиотеку, информация о файле содержится в заголовке ответа (словаре).:

 response = requests.get('https://marketdata.theocc.com/position-limits?reportType=change')
print(response.headers['content-disposition'])
 

Выходной сигнал:

 attachment; filename=POSITIONLIMITCHANGE_20201202.txt
 

Ответ №2:

Пример кода на Python для извлечения файла из URL, извлечения имени файла, сохранения в локальный файл и импорта в фрейм данных Pandas.

 import io
import requests
import re
import pandas as pd

url = 'https://marketdata.theocc.com/position-limits?reportType=change'
r = requests.get(url)
# NOTE: filename is found in content-disposition HTTP response header
s = r.headers.get('content-disposition')

# use regexp with w to match only safe characters in filename
# this will prevent accepting paths or drive letters as part of name
m = re.search(r'filename=(w )', s)
if m:
    filename = m.group(1)
else:
    # set default if filename not provided or name has bad characters
    filename = "out.csv"
print("filename:", filename)
text = r.text

# if you want to write out file with filename provided
with open(filename, 'w') as fp:
    fp.write(text)

# to read from string in-memory wrap with io.StringIO()
df = pd.read_csv(io.StringIO(text))
print(list(df.columns))
 

Выходной сигнал:

 filename: POSITIONLIMITCHANGE_20201202.txt
['Equity_Symbol','   ','Start_Date','Start_Pos_Limit','End_Date','End_Pos_Limit','Action']