1

特定のディレクトリ内のすべてのパスとファイル名のテキスト ファイルを作成しようとしています。周りを見回した後、これを行う最良の方法は GLOB 関数を使用することであり、すべてのファイルへのパスのリストを取得するコードを書くことができました。

import glob
dirlist = glob.glob('P:\MyDep\Myunit\MySection\Stuff\Reports\YR*\O*\*\*\*\*.pdf')
Bureau\Traffic\Reports\YR*\R*\*\*.pdf')
fo=open('new.txt', "w")
fo.write('\n'.join(dirlist))
fo.close()

しかし、Excel の MID ステートメントを使用してレポートから値を抽出していることに気付きました。理想的には、タプルとしてパスに含まれるファイルのベース名が欲しいです。私は次のことを思いつきました:

for f in glob.glob('P:\MyDep\Myunit\MySection\Stuff\Reports\YR*\O*\*\*\*\*.pdf'):
        fpath, fname = os.path.split(f)
        rname, extname = os.path.splitext(fname)
        dirtup = (f, rname)
        print dirtup

しかし、結果をテキスト ファイルに書き込むことはできないようです。私ができる最善の方法は、ダートアップから 1 つのリストを含むテキスト ファイルを生成することです (コードを表示するように編集され、提案が含まれています)。

import glob, os
for f in f in glob.glob('P:\MyDep\Myunit\Mysection\Stuff\Reports\YR*\O*\*\*\*\*.pdf'):
    fpath, fname = os.path.split(f)
    rname, extname = os.path.splitext(fname)
    dirtup = (f, rname)
    fo=open('axlspd.txt', "w")
    fo.write(', '.join(dirtup)+'\n')
    fo.close()

ダートアップのすべての結果をテキスト ファイルに取得するにはどうすればよいですか? 前もって感謝します。

4

3 に答える 3

2

問題は、ファイルを複数回開くことです。「w」フラグを使用すると、ファイルは開かれるたびに切り詰められ、最後の書き込みのみが表示されます。

ループの前にファイルを開き、ループの後に閉じるか、新しい with ステートメントを使用します。

import glob, os
with open('axlspd.txt', "w") as axlspd:
    for f in f in glob.glob('P:\MyDep\Myunit\Mysection\Stuff\Reports\YR*\O*\*\*\*\*.pdf'):
        fpath, fname = os.path.split(f)
        rname, extname = os.path.splitext(fname)
        dirtup = (f, rname)
        axlspd.write(', '.join(dirtup)+'\n')

そのコード ブロックを終了すると、ファイルは自動的に閉じられます。


これはあなたが見逃した参照です: http://docs.python.org/library/functions.html#open

モードの最も一般的に使用される値は、読み取り用の「r」、書き込み用の「w」です (ファイルが既に存在する場合は切り捨てます)。

于 2012-07-12T16:07:12.613 に答える
1

これにはos.walkの方が適していると思います:

import os
for root,dirs,files in os.walk('.'):
   #                            ^ Name of directory where you start your file search
   for f in files:
       print root,os.path.join(root,f)  #writes it as path path/filename

「.pdf」で終わるファイルのみが必要なようです。そのためには、最初にファイル名をフィルタリングできます。テキスト ファイルに入れるのも簡単です。

import os
with open('filelist.txt','w') as outfile:
    for root,dirs,files in os.walk('.'):
       pdfs = [f for f in files if f.endswith('.pdf')]
       for f in pdfs:
           outfile.write('%s %s\n'%(root,os.path.join(root,f)))  #writes it as path path/filename
           #New style formatting:
           #outfile.write('{0} {1}\n'.format(root,os.path.join(root,f)))
于 2012-07-12T14:12:02.333 に答える
0

問題がわかりません:

>>> import glob
>>> for f in glob.glob(r'c:\*.dll'):
...     print f
...
c:\install.res.1028.dll
c:\install.res.1031.dll
c:\install.res.1033.dll
c:\install.res.1036.dll
c:\install.res.1040.dll
c:\install.res.1041.dll
c:\install.res.1042.dll
c:\install.res.2052.dll
c:\install.res.3082.dll
c:\msdia80.dll
>>> import os
>>> for f in glob.glob(r'c:\*.dll'):
...    fpath, fname = os.path.split(f)
...    rname, extname = os.path.splitext(fname)
...    dirtup = (f, rname)
...    print dirtup
...
('c:\\install.res.1028.dll', 'install.res.1028')
('c:\\install.res.1031.dll', 'install.res.1031')
('c:\\install.res.1033.dll', 'install.res.1033')
('c:\\install.res.1036.dll', 'install.res.1036')
('c:\\install.res.1040.dll', 'install.res.1040')
('c:\\install.res.1041.dll', 'install.res.1041')
('c:\\install.res.1042.dll', 'install.res.1042')
('c:\\install.res.2052.dll', 'install.res.2052')
('c:\\install.res.3082.dll', 'install.res.3082')
('c:\\msdia80.dll', 'msdia80')
>>>

タプルをファイルに書き込むのに問題がない限り。これを試して:

# inside for loop
fo.write(', '.join(dirtup))
于 2012-07-12T13:53:33.807 に答える