Last Updated on 2025年7月28日
Pythonでファイル操作やネットワーク通信を行っていると、突然現れるのが OSError: [Errno 22] Invalid argument というエラーです。
この記事では、OSError: [Errno 22] の発生原因から具体的な修正例まで、初心者の方にも分かりやすく解説します。
目次
- OSError: [Errno 22] Invalid argument とは
- よくある原因と具体例
- ファイル操作時のOSError対策
- 日付と時刻のエラーに注意
- Windows環境での注意点
- エラー解消のチェックリスト
- よくある質問と補足情報
OSError: [Errno 22] Invalid argument とは
このエラーは、Pythonがシステムコール(OSへの操作)を行った際に、「不正な引数(Invalid argument)」が渡されたときに発生します。
|
1 |
OSError: [Errno 22] Invalid argument |
一見すると「何が間違っているのか分からない」非常に曖昧なエラーですが、多くの場合は次のような操作に起因します:
- ファイルのパス指定ミス
- 日付・時間のフォーマットミス
- システム依存の値を間違えている
よくある原因と具体例
OSError: [Errno 22] が発生するタイミングは様々ですが、代表的なケースを紹介します。
① 開くファイルのパスが不正
|
1 |
open("C:\\", "r") |
→ ディレクトリを「ファイル」として開こうとしているためエラー。
② ファイル名に禁則文字(Windows)
|
1 |
open("file:2023/01/01.txt", "w") |
→ 「/」はファイルパスとして解釈され、存在しないパスとしてエラー。
③ datetime での不正な値
|
1 |
datetime.datetime(2023, 2, 30) |
→ 存在しない日付でエラー。
ファイル操作時のOSError対策
ファイル関連でのOSErrorは、ほぼ以下のミスが原因です:
- ファイル名に
:や/などの予約文字が含まれている - 空文字列のファイル名
- 読み取り専用ファイルに書き込みしようとする
- 存在しないディレクトリに保存しようとする
修正例:
|
1 2 3 4 5 |
# 修正前(WindowsではNG) open("log:2023/08/01.txt", "w") # 修正後 open("log_2023-08-01.txt", "w") |
日付と時刻のエラーに注意
datetimeモジュールでOSErrorを引き起こすことがあります。例えば、存在しない日付や0時未満の時刻など。
例:
|
1 2 |
import datetime datetime.datetime(2023, 2, 30) # 存在しない日付でエラー |
また、タイムスタンプの範囲外(1970年以前、2100年以降)などでも問題が起こります。
Windows環境での注意点
Windows特有の原因として、以下のような制約があります:
- ファイル名に使えない文字:
\ / : * ? " < > | - ファイルパスの最大長:260文字(拡張設定で解除可)
- 予約語:
CON, PRN, AUX, NULなど
対処法:
- ファイル名の整形時には正規表現でチェック
- パス長が長くなる場合は
\\?\接頭辞を付ける(高度な対応)
エラー解消のチェックリスト
OSError: [Errno 22] が出たら、まず以下を確認しましょう:
- ファイルパスやファイル名に誤りがないか
- ファイルの読み書きモードが正しいか
- ディレクトリとファイルを混同していないか
- datetimeなどで不正な日付や時間を指定していないか
- Windowsで禁則文字を使っていないか
よくある質問と補足情報
Q. LinuxやMacでもこのエラーは出る?
はい、出ます。ただし原因が異なるケースも多いです。たとえば、システムのファイルディスクリプタ制限など。
Q. Pythonのバージョンによって挙動は変わる?
一部のバージョンでは、エラーメッセージが詳細になっていることがあります。できる限り最新バージョンを使用することをおすすめします。
Q. 一時ファイルでこのエラーが出るのはなぜ?
tempfileで生成した一時ファイルが閉じられていたり、パスが削除されているとこのエラーが出ます。
エラーは学習のチャンスです。同じエラーが再発しないよう、この記事で紹介したチェックポイントを習慣化しておきましょう。
他にもPythonエラーの記事を多数公開していますので、ぜひブックマークしておいてください。


