質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

4回答

233閲覧

for文を使用したファイル名の記入方法

shunsuke1937

総合スコア48

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

0クリップ

投稿2019/01/26 01:52

編集2019/01/26 05:23

スクレイピングをする際に、urlを下記のように1~12まで変更して次々と読み込ませます。

python

1from bs4 import BeautifulSoup 2import requests 3import pandas as pd 4from pandas import Series,DataFrame 5import time 6import numpy as np 7 8list=range(1,13) 9A=pd.DataFrame() 10for i in list: 11 url = 'www.aaa'+str(i) 12 result = requests.get(url) 13 c = result.content 14 soup = BeautifulSoup(c,'lxml') 15 summary = soup.find('div',{'class':'contentsFrame1'}) 16 table = summary.find_all('table') 17#省略 18192021 A.to_csv('user/'f'{i}_.csv')  #スクレイピングした結果をcsvファイルに書き出します。 22#ファイル 1_.csv,2_.csv,・・・,12_.csv

そこでこのファイル名をurlを読み込ませる際には
www.aaa1~www.aaa-12の12個のサイトのurlを読み込ませております。
www.aaa1とした時には読み込んだサイトを上記では1_.csv
という風になります。
後々のファイル等の操作する関係で桁数が異なると困りますので、1~9を読み込ませる際には先頭に0をつけて
01_.csvにしたいと思っています。

関数を定義して記入できないかと考えましたが、なかなかいい方法が思い浮かびません。
ご教示のほどよろしくお願いいたします。

oasis701👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hit701

2019/01/26 03:54

importの記述が不完全なので、記述をお願いします。 それから >そこでこのファイル名をurlを読み込ませる際には1~12で読み込ませているのですが、 ファイル名を読み込ませたいのですか?urlを読み込ませたいのですか?それとも両方ですか? 正しく記載しないと戸惑ってしまいます。明確に記述して下さい。 よろしくお願いします。
guest

回答4

0

後々のファイル等の操作する関係で桁数が異なると困りますので、1~9を読み込ませる際には先頭に0をつけて

01_.csvにしたいと思っています。

フォーマットを工夫すれば対応可能です。

Python

1A.to_csv(f'user/{i:02}_.csv')

投稿2019/01/26 01:55

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hit701

2019/01/27 06:26

LouiS0616さん {i:02}というフォーマットの定義を説明した文書はあるでしょうか? ご回答よろしくお願いします。
LouiS0616

2019/01/27 06:41

0 ← 0埋め 2 ← 2ケタ ですね。
hit701

2019/01/27 08:16

ありがとうございます????
shunsuke1937

2019/01/28 12:44

そういうことですか!理解できました。ご回答いただきましてありがとうございました。
guest

0

a.py

python3

1from pathlib import Path 2 3out_dir = "user" 4for i in range(1, 13): 5 print(Path(out_dir, f'{i:02}_.csv'))

実行例
イメージ説明

参考情報

  • Python3 文字列中に変数展開したい

https://chaika.hatenablog.com/entry/2018/08/16/090000

  • オブジェクト指向のファイルシステムパス

https://docs.python.org/ja/3/library/pathlib.html#concrete-paths

投稿2019/01/26 02:48

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunsuke1937

2019/01/28 12:45

参考文献までご教示いただきましてありがとうございました。 理科することができました。 ありがとうございました。
guest

0

LouiS0616さんが紹介して頂いたフォーマット(初めて知りました)で下記のコードを書いたところ、
作成出来ました。

python

1from bs4 import BeautifulSoup 2import requests 3import pandas as pd 4from pandas import Series,DataFrame 5import time 6import numpy as np 7 8list=range(1,13) 9#A=pd.DataFrame() 10for i in list: 11 #url = 'www.aaa'+str(i) 12 url = "https://quality-start.in/company/" 13 result = requests.get(url) 14 c = result.content 15 #soup = BeautifulSoup(c,'lxml') 16 soup = BeautifulSoup(c, 'html.parser') 17 #summary = soup.find('div',{'class':'contentsFrame1'}) 18 summary = soup.find("div", class_="list-group") 19 table = summary.find_all('a') 20 df = pd.DataFrame(table) 21 df.to_csv(f'user/{i:02}_.csv') ← なぜこの文で上手く作成できるのか理解できていませんが?

投稿2019/01/27 02:31

編集2019/01/27 06:23
hit701

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunsuke1937

2019/01/28 12:43

上記の方法で結果を得ることができました、全く理解ができなかったです。
guest

0

ベストアンサー

数が数十前後で良いのであれば、泥臭く、elif文を使って作成してみました。
貴殿のサイト名では、値を取得出来ないので、こちらで取得できる、サイトとコードで対応してみました。

python

1from bs4 import BeautifulSoup 2import requests 3import pandas as pd 4from pandas import Series,DataFrame 5import time 6import numpy as np 7 8list=range(1,13) 9A = pd.DataFrame() 10for i in list: 11  #url = 'http://www.aaa' + str(i) ←貴殿のサイト名では、具体的なデータを取得出来ないのでコメントアウト 12 url = "https://quality-start.in/company/" ← 貴殿のurlは不明なため、当方で用意しました。 13  このurlのなかに、ご希望の+(i)を含む、webサイトをご指定下さい。 14 result = requests.get(url) 15 c = result.content 16 soup = BeautifulSoup(c,'html.parser') 17 #summary = soup.find('div',{'class':'contentsFrame1'})←取得するデータが無いためコメントアウト 18 summary = soup.find("div", class_="list-group") 19 #table = summary.find_all('table') ←取得するデータに'tabel'の文字が無いためコメントアウト 20 table = summary.find_all('a') 21 #table = summary.findAll('a') ←このメソッドでも動きます。 22#省略 23 df = pd.DataFrame(table) 24 if i == 1 : 25 j = '01_' 26 elif i == 2: 27 j = '02_' 28 elif i == 3: 29 j = '03_' 30 elif i == 4: 31 j = '04_' 32 elif i == 5: 33 j = '05_' 34 elif i == 6: 35 j = '06_' 36 elif i == 7: 37 j = '07_' 38 elif i == 8: 39 j = '08_' 40 elif i == 9: 41 j = '09_' 42 elif i == 10: 43 j = '10_' 44 elif i == 11: 45 j = '11_' 46 elif i == 12: 47 j = '12_' 48 else: 49 print('error') 50 df.to_csv('user/'f'{j}.csv') 51 #スクレイピングした結果をcsvファイルに書き出します。 52#ファイル 1_.csv,2_.csv,・・・,12_.csv

その結果、

user/01_.csv user/02_.csv 省略 user/11_.csv user/12.csv

と,usr下に三桁の、csvファイルを作成出来ました。
数がもっと必要なら、for文で、数字に対する文字列のマトリックスを作って、それを参照して、csvを作成できれば良いのではないかと考えます。
いかがでしょうか?

投稿2019/01/26 15:23

編集2019/01/27 01:00
hit701

総合スコア148

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shunsuke1937

2019/01/28 12:42

ご回答ありがとうございます。 上記の方法で結果を得ることができました。 一番理解しやすく基本的な方法で、if分を理解することができました。 ありがとうございました。
hit701

2019/01/28 13:54

どういたしまして。 ご質問して頂き、私、勉強になりました。 今後もよろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問