2017-06-12 18 views
0

私はPDF生成プログラムを作成しています。 1つの機能は、すべてのpdfsをマージして後のすべての部分を削除することです。私はpdfsのパスを変更するまで完全に動作しています。私は1つのディレクトリに戻ってそれを設定している場合files_dir変数を見てみるとOS.REMOVEは正常に動作していません

def pdf_cleanup(name): 
    files_dir = '/root/PycharmProjects/ReportApp/FML/Pdf_Docs' 

    xx = [f for f in os.listdir(files_dir) if f.endswith("pdf")] 

    for f in xx: 
     if f.startswith(name): 
      pass 
     else: 
      os.remove(f) 
    return 

- それが正常に動作したよりそれがこのfiles_dir = '/root/PycharmProjects/ReportApp/FML'次のようになります。ここでは関数です。私がPdf_Docsディレクトリでそれを使用しようとすると、 'name_of_pdf'が存在しないと言ってエラーになります。

トレースバック:

/usr/bin/python3.5 /root/PycharmProjects/ReportApp/FML/dump.py 
Traceback (most recent call last): 
    File "/root/PycharmProjects/ReportApp/FML/dump.py", line 16, in <module> 
    pdf_cleanup('mer') 
    File "/root/PycharmProjects/ReportApp/FML/dump.py", line 13, in pdf_cleanup 
    os.remove(f) 
FileNotFoundError: [Errno 2] No such file or directory: 'Main_Calls.pdf' 

Process finished with exit code 1 

は私が見下ろす午前愚かと小さなものがあります?なぜ私は1つのフォルダを変更するとそれを壊すのか分かりません。

+0

新しい場所を使用していないようです。 'os.remove(files_dir + '/' + f)' –

+0

'os.listdir(files_dir)'はリストを返しますファイル名+拡張子のこのように、ファイルが実行可能ファイルと同じディレクトリにある場合に機能します。したがって、パスとファイル名を結合するには 'os.remove(os.path.join(files_dir、f))'を呼び出す必要があります。 –

答えて

3

os.listdir()だけで、あなたにはない自分のパスを、ファイル名を与えるだろう、すなわち:

>>> files_dir = "/home/bruno/Work/blookup/src/project/blookcore" 
>>> [f for f in os.listdir(files_dir) if f.endswith(".py")] 
['tasks.py', 'posts.py', 'models.py', '__init__.py', 'signals.py', 'urls.py', 'utils.py', 'translation.py', 'views.py', 'forms.py', 'fields.py', 'storages.py', 'admin.py', 'managers.py'] 

あなたはファイル名のいずれかにos.remove()を呼び出すときに、それが現在の作業ディレクトリにこのファイルのを探し、 files_dirにはありません。

ソリューションは、プレーンと簡単です:完全なパスを取得するにはfiles_dirfに参加:サイドノートとして

os.remove(os.path.join(files_dir, f)) 

:あなたはforループ内の1つのリスト内包でのテストと別のものを持っています。あなたにも、リストのcompの両方に置くことができます:

xx = [ 
    f for f in os.listdir(files_dir) 
    if f.endswith("pdf") and not f.startswith(name) 
    ] 

for f in xx: 
    os.remove(os.path.join(files_dir, f)) 
+0

ありがとうございました! – Joe

0

xxはパスをファイルではありません、ファイル名のリストです。次のようにパスをマージしてください:os.remove(os.path.join(files_dir, f))

関連する問題