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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

337閲覧

str.formatで記号をフォーマットできない

jupeeze

総合スコア5

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2022/06/21 22:03

編集2022/06/21 23:12

発生している問題・エラーメッセージ

例外が発生しました: OSError [Errno 22] Invalid argument: 'ポケモンの日常(生活)/Steven "Ski" Nosov さん.jpg'

'{}.jpg'.format(name)
で、nameが n:go さん だと、: 以降の文字がフォーマットされなかったり、
Steven "Ski" Nosov さん の場合は上記のエラーが出てしまいます。
" : などの記号も含めてフォーマットするにはどうすればいいでしょうか?

該当のソースコード

python

1import time 2 3import requests 4from selenium import webdriver 5from selenium.webdriver.common.by import By 6 7 8def main(): 9 driver = webdriver.Firefox( 10 executable_path='..\\geckodriver.exe') 11 driver.get('https://www.ptcgic-cr.com/2022/result/primary-selection/') 12 driver.set_window_position(0, 0) 13 driver.set_window_size(800, 600) 14 15 time.sleep(10) 16 17 elements = driver.find_elements( 18 By.XPATH, '//section[@class="prize-Artworks_Item"]') 19 for element in elements: 20 img = element.find_element( 21 By.XPATH, './/img') 22 name = element.find_element( 23 By.XPATH, ".//h3").get_attribute("textContent") 24 src = img.get_attribute("src") 25 responce = requests.get(src) 26 with open('ポケモンの日常(生活)/' + '{}.jpg'.format(name), "wb") as f: 27 f.write(responce.content) 28 29 driver.close() 30 driver.quit() 31 32 33if __name__ == '__main__': 34 main()

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

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

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

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

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

y_waiwai

2022/06/21 22:13

どういうふうにフォーマットしたいのか詳しく説明しよう 質問文は編集できるんで、そっちに説明を書いてください
quickquip

2022/06/21 22:34

何に困っているかが伝わってないです。 こうなるのを期待して、こういうコードを書いたけれど、期待に反してこうなったorエラーが出て動かない という書き方をしてもらえるといいと思います。
jupeeze

2022/06/21 22:47

質問が不十分で申し訳ありませんでした。 追記したので、回答いただけると嬉しいです。
quickquip

2022/06/21 22:58

>>> print('{}.jpg'.format('aaa:bbb')) aaa:bbb.jpg >>> print('{}.jpg'.format('aaa"bbb')) aaa"bbb.jpg 再現しないので何かを勘違いしている/状況の認識の方が間違っていると思います。 解決のためには、実際のコードとデータとエラーメッセージが要りそうです。
chirimen

2022/06/21 23:49

エラーが出ているのは format ではなくて open の方ではないでしょうか。 format で作成したファイル名を一旦別の変数に入れるなどして動作確認してみましょう。 ちなみに Windows では ':' はファイル名に使用できません。
guest

回答1

0

ベストアンサー

文字フォーマットの問題ではなく、"などのファイル名として使えない文字が含まれているのでファイルが開けず提示エラーが発生しています。
Windowsでは\/:*?"<>|は使えません。
対策としてはそのような文字を削除する、_なりに置換する、など対応する全角文字に置換するとよいでしょう。
以下、_に置換するコード例です。
ただしA*BA/Bも同じA_Bになってしまう(ファイル名がかぶる)ケースがありえることに注意ください。

Python

1import re 2 3# 置換対象の文字 4# ファイル、パス、名前空間の名前付け 5# https://docs.microsoft.com/ja-jp/windows/win32/fileio/naming-a-file 6rep = r'[\x00-\x1F\x7F]' # 制御文字 7rep += '|' + '|'.join([re.escape(c) for c in r'\/:*?"<>|']) # 予約(禁止)文字 8rep += '|' + '|'.join([re.escape(c) for c in r' .']) # 使わないほうが無難な文字 9pat = re.compile(rep) 10 11name = '\t-\\/:*?"<>|-. abcあいう' 12ret = pat.sub('_', name) 13print(f'[{name}]->[{ret}]') 14# [ -\/:*?"<>|-. abcあいう]->[_-_________-__abcあいう]

投稿2022/06/22 01:28

can110

総合スコア38256

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

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

jupeeze

2022/06/22 11:04

無事完成しました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問