9

「open(fname、'w +')」を使用して新しいファイルを開こうとすると、以下に示すIOErrorが発生します。完全なエラーメッセージは以下のとおりです。

ファイルは存在しませんが、「os.access(dir_name、os.W_OK)」と「os.path.exists(dir_name)」を使用して、ファイルの親ディレクトリが存在することを確認しました。

ファイル名がWindowsには長すぎるのか、それとも何か間違ったことをしているのか疑問に思います。ヒントをいただければ幸いです。どうもありがとうございます。

エラーメッセージ:

IOError:[Errno 2]そのようなファイルまたはディレクトリはありません:'C:\ Documents and Settings \ Administrator \ op_models \ Corp_Network_Nov12 \ abcde_corporate_nov_12.project \ abcde_corporate_nov_12-ctr.rptd.dir \ ctr \ Non Business Hours for Weeknights \ hourly_data_for_ json.data \ Link \ 0 \ Link Utilization \ analyzer393146160-data0.js '

4

5 に答える 5

7

Windows API では、パスの最大長は 260 文字に制限されています。

http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx

更新: パスの先頭に「\\?\」を追加します。

于 2011-01-13T06:07:20.910 に答える
4

これは私のために働くいくつかの関連コードです(私は非常に長いファイル名とパスを持っています):

for d in os.walk(os.getcwd()):
    dirname = d[0]
    files = d[2]
    for f in files:
        long_fname = u"\\\\?\\" + os.getcwd() + u"\\" + dirname + u"\\" + f
        if op.isdir(long_fname):
            continue
        fin = open(long_fname, 'rb')
        ...

私にとっては、次のすべての組み合わせでのみ機能することに注意してください。

  1. 前に '\\?\' を追加します。

  2. 相対パスではなく、絶対パスを使用してください。

  3. バックスラッシュのみを使用してください。

  4. Python では、ファイル名の文字列は、「abc」ではなく、u「abc」などの Unicode 文字列である必要があります。

また、何らかの理由os.walk(..)でディレクトリの一部がファイルとして返されたため、上記で確認しました。

于 2012-11-04T04:02:04.653 に答える
0

ファイル名の長さでない場合は、ファイル名の内容です...

Pythonは「\12」を制御シーケンスとして扱っています。

>>> fn='C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js'
>>> print fn
C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12bcde_corporate_nov_12.projectbcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks
94897740\json.data\Link\Link Utilizationnalyzer393146160-data0.js

Windowsファイル名に生の文字列を使用すると次のことが役立ちます。

>>> fn=r'C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js'
>>> print fn
C:\Documents and Settings\Administrator\op_models\Corp_Network_Nov12\abcde_corporate_nov_12.project\abcde_corporate_nov_12-ctr.rptd.dir\ctr\Non Business Hours for Weeknights\hourly_data_for_2_weeks\1294897740\json.data\Link\0\Link Utilization\analyzer393146160-data0.js

アップデート

または、バックスラッシュ'\'の代わりにスラッシュ'/'を使用します。これは、すべてのオペレーティングシステムで機能し、コメントのようにパス名の最後にバックスラッシュを付ける手間を省くためです。

も参照してくださいos.path.join()

アップデート2

問題の簡略化されたデモンストレーション:

>>> open('.\12\n\r\file.txt')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: [Errno 2] No such file or directory: '.\n\n\r\x0cile.txt'
>>> open('./12/n/r/file.txt')
<open file './12/n/r/file.txt', mode 'r' at 0x7ff83f98>

C:\Users\johnysweb>copy .\12\n\r\file.txt con
Blah
        1 file(s) copied.
于 2011-01-13T06:11:45.680 に答える
0

パス全体の長さを確認し、必要な Windows ロング パス形式を追加します。これは、リモート ディレクトリからデータにアクセスする場合、つまり「\\some_remote_location\..」で始まるパスでは機能しないことに注意してください。そのため、「長いパス」を機能させるには、そのディレクトリをローカルにマップする必要があります。

if len(path_and_file) > 250: #I think the max is 260 but I left a buffer :)
    path_and_file = '\\\\?\\'+path_and_file
于 2019-03-14T18:33:29.750 に答える