0

次のコードがあります。

with open('EcoDocs TK pdfs.csv', 'rb') as pdf_in:
    pdflist = csv.reader(pdf_in, quotechar='"')
    for row in pdflist:
        if row[1].endswith(row[2]):#check if file type is appended to file name
            pathname = ''.join(row[0:2])
        else:
            pathname = ''.join(row)
        if os.path.isfile(pathname):
            filehash = md5.md5(file(pathname).read()).hexdigest()

csv ファイルからファイル パス、ファイル名、ファイル タイプを読み取ります。次に、ファイル パスとファイル名を結合する前に、ファイル タイプがファイル名に追加されているかどうかを確認します。次に、ファイルに対して何かを行う前に、ファイルが存在するかどうかを確認します。csv ファイルには約 5000 個のファイル名がありますが、isfile はこれらの約半分についてのみ True を返します。これらの isfile の一部が存在する場合に False を返すことを手動で確認しました。すべてのデータが読み込まれるので、エスケープ文字や単一のバックスラッシュに問題はないはずなので、少し困惑しています。何か案は?csv ファイル形式の例を以下に示します。またpathname、isfile で見つけられないファイルの例もいくつか示します。

csvファイル-

c:\2dir\a. dir\d dir\lo dir\fu dir\wdir\5dir\,5_l B.xls,.xls
c:\2dir\a. dir\d dir\lo dir\fu dir\wdir\5dir\,5_l A.pdf,.pdf

作成されたパス名-

c:\2dir\a. dir\d dir\lo dir\fu dir\wdir\5dir\5_l B.xls
c:\2dir\a. dir\d dir\lo dir\fu dir\wdir\5dir\5_l A.pdf

ありがとう。

4

1 に答える 1

0

os.path.isfile()それが正しく機能すると安全に想定できます。このような問題をデバッグするための私のプロセスは次のとおりです。

  1. print(pathname)使用する前に追加します。
  2. 出力に注目してください。何か不審に見えますか?
  3. 出力をクリップボードにコピー -> Win+RcmdReturndirSpace"+ 新しいコマンド プロンプトに貼り付け +"Return
    これにより、パスが本当に正しいかどうかがチェックされます (目視では見逃されるわずかな間違いを見つけます)。また、Windows でも適用されている常軌を逸したDOS 命名規則を検証するのにも役立ちます。
  4. これも機能する場合、次のステップはファイルとフォルダーのアクセス許可を確認することです。スクリプトを実行するユーザーが実際にファイルを表示および読み取るアクセス許可を持っていることを確認します。

Windows のEDITパスは ... 複雑です。たとえば、重要な詳細は「。」です。非常に特殊なキャラクターです。"a.something very long" という名前は、コマンド プロンプトでは有効ではありません。これは、最後の "." の後に 3 文字以内ある必要があるためです。ファイル名に!最後のドットの前の名前が最大 8 文字である必要がないことは幸運です。

結論: Windows のファイル名とパスに含まれる「奇妙な文字」には、非常に、非常に、非常に注意する必要があります。安全な文字のみがこのドキュメントにリストされています

于 2013-09-25T15:03:58.097 に答える