[python]openでファイルが存在するのに、存在しないと表示される。

事象

fp=open(“test – 01.txt”)

という風に、ファイルを開いているだけだが、

FileNotFoundError: [Errno 2] No such file or directory: ‘test – 01.txt’

という風に、ファイルが存在しないというErrorが出て開けない。

原因

特殊文字が含まれていた。

この場合だと、「-」が普通のハイフンじゃなかったらしい。

どうしたらいいか悩んだんだけど、以前、ファイル名の表示だと「グ」という風に表示されるが、この文字をテキストエディタにコピペすると「ク゛」という風に濁点が分離する形式で表示され、ファイル名を表示されてる通りにコマンドプロンプトに打ってるのに、コマンドが利かないことがあった。

何でも、MACだとNFDという形式を使ってるが、WindowsだとNFCという形式で使ってるので、これでトラブルことが多いらしい。

解決策

今回の事とは違うが、もしかしてこの形式変換したら、治ったりしないかと思い試してみたところ、あっさり読めるようになった。

因みに、昔作ったコードはこんな感じ。

# strcode.py
# Copyright (c) 2022 メモ帳兼日記帳なブログ
# https://memo-nikki.info/?p=3368
# 利用の際は、著作権者、URL、本利用規約を記載のこと。
# 年間売り上げ1000万以下の個人及び法人に関しては、無償で利用可。
# その他の利用は、使用した全コードの公開を行う場合は無償。
# 非公開コードへ適用する場合は、利用料を支払うこと。
# 本コードの利用に伴って被った一切の損害に対して、著作者は責任を負わない。

import sys
import unicodedata

def isnfd(strin):
    for char in strin:
        if unicodedata.combining(char) != 0:
            return True
    return False

# 文字にNFDが含まれていたら、NFCに変換した文字列を返す。
def nfd2nfc(strin):
	if isnfd(strin):
		strret = unicodedata.normalize('NFC', strin)
	else:
		strret=strin
	return strret

このコードをstrcode.pyってファイル名で保存して、import strcodeってすると使えます。

retstr=strcode.nfd2nfc(“変換したい文字列”)

で、retstrに変換した文字列が返る。

この戻り値を使うとファイルが開けた。

追記

開けたと思ったけど、sys.argv[1]という風に、引数としてファイル名を与えていると、うまく開けなかった。コード内にファイル名をコピペするといけるんだが、何故だろう。。。

追記(2022/11/27)

コマンドプロンプトから引数として、ファイル名を送ったらうまく開けなかったのは、ファイル名に「–」ダッシュが含まれてたから見たい。厄介なことに、テキストエディタなどから、コマンドプロンプトにでダッシュをペーストすると、自動で「-」ハイフンに変換される。このため、コマンドをコピペすると、存在しないファイル名に勝手に変換されるため、ファイルが存在しないというエラーになってるみたい。

因みに、コマンドプロンプト上で、「だっしゅ」と入力して変換すると、「–    [環境依存文字]」という感じで表示され、ダッシュを入力することが出来た。

コマンドプロンプトの設定で何か変えられるのかと思ったけどそれっぽいのも見つからない。

コマンドプロンプトにchcp 65001って打って、utf-8に変えてみてもダメ。

というわけで、コマンドプロンプトにダッシュをペーストするのはダメだった。

仕方がないので、対象のファイルをD&D(ドラッグ&ドロップ)して実行させるバッチを作ってみた。

@rem test_1.bat
python exttest.py %1
pause

このコードを書いたbatファイルを作成し、対象のファイルをbatファイルにD&Dしたところ、exttest.pyにダッシュを含んだファイル名を送ることが出来た。

一先ずはこれで使おうと思う。

 

関連メモ

コマンドプロンプトの設定

 コマンドプロンプトのタイトルバーを右クリック→プロパティ

Code Page Identifiers
https://learn.microsoft.com/en-us/windows/win32/intl/code-page-identifiers

ex)

 chcp 65001

932 shift_jis ANSI/OEM Japanese; Japanese (Shift-JIS)
65001 utf-8 Unicode (UTF-8)

 

コメント

PAGE TOP
Ads Block Detector Powered by codehelppro.com
Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました