Python:检测现有文件:os.file.exists

时间:2015-01-15 00:24:52

标签: python

我显然做了一件非常错事。我想找到一个目录但不在第二个目录中的文件(例如一个目录中的xxx.phn和第二个目录中的xxx.wav ......

我似乎无法检测到,当第二个目录中没有文件时(它总是显示所有文件都是)...我不会显示任何文件,尽管它们存在。

import shutil, random, os, sys

if len(sys.argv) < 4:
    print """usage: python del_orphans_dir1_dir2.py source_folder source_ext dest_folder dest_ext
             """
    sys.exit(-1)

folder = sys.argv[1]
ext  = sys.argv[2]
dest_folder = sys.argv[3]
dest_ext  = sys.argv[4]
i = 0

for d, ds, fs in os.walk(folder):
    for fname in fs:
        basename = os.path.splitext(fname)[0]
        if (not os.path.exists(dest_folder+'/'+basename + '.' + dest_ext) ):
            print str(i)+': No duplicate for: '+fname
            i=i+1      

print str(i)+' files found'

3 个答案:

答案 0 :(得分:1)

在检查是否存在之前,我是否可以建议您创建您正在检查并打印的文件名。

dest_fname = dest_folder+'/'+basename + '.' + dest_ext
print "dest exists? %s" % dest_fname
os.path.exists(dest_fname)

另外,请使用join()方法加入路径。 (如果你真的想要没有前导路径元素的basename,那就是basename()函数。)

答案 1 :(得分:0)

我尝试了你的程序,它适用于两个简单的平面目录。以下是目录内容:

a\a.txt
a\b.txt      # Missing from b directory
a\c.txt
b\a.csv
b\c.csv

a txt b csv为参数的脚本结果。如果你的结果不同,也许你使用了不同的参数?

0: No duplicate for: b.txt
1 files found

但是当我添加子目录时:

a\a.txt
a\b.txt      # Missing from b directory
a\c.txt
a\c\d.txt
a\c\e.txt    # Missing from b\c directory
b\a.csv
b\c.csv
b\c\d.csv

你的脚本给出了:

0: No duplicate for: b.txt
1: No duplicate for: d.txt      # Error here
2: No duplicate for: e.txt
3 files found

要使用子目录,您需要计算相对于源目录的路径,然后将其添加到目标目录。这是其他一些小清理和打印的结果,看看发生了什么。请注意,fname始终只是文件名,需要与d结合才能获得整个路径:

#!python2
import os, sys

if len(sys.argv) < 4:
    print """usage: python del_orphans_dir1_dir2.py source_folder source_ext dest_folder dest_ext
             """
    sys.exit(-1)

folder = sys.argv[1]
ext  = sys.argv[2]
dest_folder = sys.argv[3]
dest_ext  = sys.argv[4]
i = 0

for d, ds, fs in os.walk(folder):
    for fname in fs:
        relpath = os.path.relpath(os.path.join(d,fname),folder)
        relbase = os.path.splitext(relpath)[0]
        path_to_check = os.path.join(dest_folder,relbase+'.'+dest_ext)
        if not os.path.exists(path_to_check):
            print '{}: No duplicate for: {}, {} not found.'.format(i,os.path.join(folder,relpath),path_to_check)
            i += 1

print i,'files found'

输出:

0: No duplicate for: a\b.txt, b\b.csv not found.
1: No duplicate for: a\c\e.txt, b\c\e.csv not found.
2 files found

答案 2 :(得分:0)

您正在寻找的是匹配的文件,而不是重复的文件。一个问题是你在搜索时没有使用source_ext参数。另一个是我认为命令行参数处理是混乱的。这是一个更正后的版本,可以完成你想要做的事情:

import os
import sys

if len(sys.argv) != 5:
    print("usage: python "
          "del_orphans_dir1_dir2.py "  # argv[0] (script name)
          "source_folder "             # argv[1]
          "source_ext "                # argv[2]
          "dest_folder "               # argv[3]
          "dest_ext")                  # argv[4]
    sys.exit(2)  # command line error

source_folder, source_ext, dest_folder, dest_ext = sys.argv[1:6]
dest_ext = dest_ext if dest_ext.startswith('.') else '.'+dest_ext  # check dot

found = 0
for d, ds, fs in os.walk(source_folder):
    for i, fname in enumerate(fs, start=1):
        basename, ext = os.path.splitext(fname)
        if ext == source_ext:
           if os.path.exists(os.path.join(dest_folder, basename+dest_ext)):
                found += 1
           else:
                print '{}: No matching file found for: {}'.format(i, fname)

print '{} matches found'.format(found)
sys.exit(0)