python fnmatch 无法找到文件

0 投票
2 回答
510 浏览
提问于 2025-04-17 19:07

我有一个文件夹,里面有很多子文件夹,每个子文件夹里都有很多csv文件,但我只对某些特定的csv文件感兴趣。所以我写了下面这个Python方法,但我无法获取到文件名。如果我用*.csv,它会找到所有的文件,但我并不想读取所有的文件:

def gatherStats(template_file, csv_file):
    for lang in getLanguageCodes(csv_file):
        lang_dir = os.path.join(template_file, lang)
        try:
            for file in os.listdir(lang_dir):
                if fnmatch.fnmatch(file, '*-*-template-users-data.csv'):
                    t_file = open(file, 'rb').read()
                    reader = csv.reader()
                    for row in reader:
                        print row
                else:
                    print "didn't find the file"
        except Exception, e:
            logging.exception(e)

我这里做错了什么呢?是正则表达式的问题吗?我们可以在fnmatch中使用正则表达式吗?

2 个回答

1

你的代码有几个问题。先把这些问题解决了,然后我们再来看看你真正遇到的是什么问题。

  • 首先,不要把内置的名称当作变量,比如说 file。可以把它换成 filename
  • 然后在打开文件之前,使用 os.path.join(lang_dir, filename)。这意味着:

    t_file = open(os.path.join(lang_dir, filename), 'rb').read()
    
  • 如果你在这一行没有提到你打开的文件对象,reader = csv.reader() 怎么能读取你的文件呢?

  • 你的 try/except 代码块范围有点大。慢慢来,缩小一下可能出现的错误范围。然后决定哪些错误你想忽略,哪些错误应该让程序崩溃。仔细看看这个代码块中实际抛出的异常。你可能会在这里找到你的问题。
0

在另一位用户的帮助下,我成功解决了这个问题。我把这个答案放在这里,方便以后大家参考。

def gatherStats(template_file, csv_file):
    for lang in getLanguageCodes(csv_file):
        lang_dir = os.path.join(template_file, lang)
        try:
            for filename in os.listdir(lang_dir):
                path = os.path.join(lang_dir, filename)
                if re.search(r'-.+-template-users-data.csv$',filename):
                    with open(path, 'rb') as template_user_data_file:
                        reader = csv.reader(template_user_data_file)
                        try:
                            for row in reader:
                                print row
                        except csv.ERROR as e:
                            logging.error(e)
                else:
                    print "didn't find the file"
        except Exception, e:
            logging.exception(e)

撰写回答