如何在python中使用glob模式读取目录中的文件?

时间:2016-07-28 14:25:12

标签: python file directory glob

我想在一个目录中读取文件。

目录包含:

ABC1.csv
ABC1_1.csv
ABC1_2.csv
ABC11.csv
ABC11_1.csv
ABC11_3.csv
ABC11_2.csv
ABC13_4.csv
ABC13_1.csv
ABC17_6.csv
ABC17_2.csv
ABC17_4.csv
ABC17_8.csv

在运行脚本时我想给读取特定文件的命令行参数取决于某些条件:

  1. 如果用户仅提供ABC错误消息。
  2. 如果用户给ABC1,那么它必须只读ABC1.csv,ABC1_1.csv和ABC1_2.csv。
  3. 如果用户给ABC11,那么它必须只读ABC11.csv,ABC11_1.csv,ABC11_2.csv,ABC11_3.csv。
  4. 如果用户给ABC13,则必须只读ABC13_1.csv,ABC13_4.csv。
  5. 如果用户给ABC17,那么它必须只读ABC17_2.csv,ABC17_4.csv,ABC17_6.csv,ABC17_8.csv。
  6. 对于这些东西,我创建了一个脚本,但我面临着问题。

    程序 -

    from glob import glob
    import os
    import sys
    
    file_pattern = ''
    files_list = list()
    arguments = {'ABC', 'PQR', 'XYZ'}
    
    if len(sys.argv[1:2]) is 1:
       file_pattern = str(sys.argv[1:2])
    else:   
       print 'run as <python test.py ABC>'
       sys.exit(1)
    if file_pattern in arguments:
       print '<Provide Name with some Number>'
       sys.exit(1)
    
    file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','')
    
    if file_pattern.startswith('ABC',0,3):
       files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv'))
    else:
       print 'No Such File --> ' + str(file_pattern)+ '\t  <Provide appropriate Name>'
       sys.exit(1)
    
    if files_list:
       for a_file in sorted(files_list):
          print a_file
          #process file
    else:
       print 'No Such File --> ' + str(file_pattern)+ '\t  <Provide appropriate Name>'
       sys.exit(1)
    

    此代码工作正常,但它不能满足我的第二个条件。当用户将ABC1作为参数,即python test.py ABC1时,它将返回文件ABC1_1.csv,ABC1_2.csv但不返回ABC1.csv文件。

    如何在不失去任何其他条件的情况下满足第二个条件?

3 个答案:

答案 0 :(得分:1)

我尝试了不同的场景,最终得到了满足我所有条件的精确解决方案。首先,我检查用户输入文件是否可用在指定目录中,如果可用,则将具有相同文件的所有文件全部用(_)全部附加到同一列表的匹配文件。

如果用户输入(如果没有文件)在指定目录中不可用,那么我正在检查带有(_)符号的文件,然后将所有文件全部列入列表。最后迭代列表并得到最终结果。

计划 -

from glob import glob
import os
import sys

file_pattern = ''
files_list = list()

arguments = {'ABC', 'PQR', 'XYZ'}

#checking for user provided argument or not
if len(sys.argv[1:2]) is 1:
   file_pattern = str(sys.argv[1:2])
else:   
   print 'run as < python test.py <LineName> >'
   sys.exit(1)
#replace all unnecessary stuff with ('')
file_pattern = file_pattern.replace('[','').replace(']','').replace('\'','')

#checking for line number is provided or not
if file_pattern in arguments:
   print '<Provide LineName with some Number>'
   sys.exit(1)

flag = True
#list of all files containing specified directory
files = os.listdir('<directory name>')

for file_name in files:
   if str(file_name) == str(file_pattern)+'.csv':
      files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv'))
      #appending match file also to resultant list
      files_list.append('<directory name>'+file_name)
      flag = False
#if specified file is not present in dir check for filename with (_)
if flag:
   files_list = glob(os.path.join('<directory name>', str(file_pattern)+'_*.csv'))

#checking for list contains items or not
if files_list:
   for a_file in sorted(files_list):
      print a_file
else:
   print 'No Such File --> ' + str(file_pattern)+ '\t  <Provide appropriate Name1>'
   sys.exit(1)

考虑目录包含ABC1.csv,ABC1_1.csv,ABC1_2.csv,ABC11.csv,ABC11_1.csv,ABC11_3.csv,ABC11_2.csv文件。

输出方案:

#if input is ABC1
.\\ABC1.csv
.\\ABC1_1.csv
.\\ABC1_2.csv
#if input is ABC11
.\\ABC11.csv
.\\ABC11_1.csv
.\\ABC11_2.csv
.\\ABC11_3.csv

答案 1 :(得分:0)

我有一个解决方案。它不完美,取决于文件夹中是否有其他文件:

file_pattern = 'ABC1'
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*'))
# output: ABC1.csv, ABC1_1.csv, ABC1_2.csv

file_pattern = 'ABC11'
files_list = glob(os.path.join('<directory name>', str(file_pattern)+'[!0-9]*'))
# output: ['.\\ABC11.csv', '.\\ABC11_1.csv', '.\\ABC11_2.csv', '.\\ABC11_3.csv']

我和Jesper有同样的问题。问题是虽然*会匹配任何字符,但它需要一个字符!

通过选择文件模式后没有数字的任何文件,我们可以避免1-11问题。

答案 2 :(得分:0)

您可能希望为其他&#34;特殊&#34;添加一个简单的检查。案例,像这样:

if file_pattern.startswith('ABC',0,3):
   csv_path = os.path.join('.', str(file_pattern))
   files_list = glob(csv_path + '_*.csv')
   # Just check the special case that's not included in the glob above
   csv_path = csv_path + '.csv'
   if os.path.isfile(csv_path):
      files_list.append(csv_path)
else:
   print 'No Such File --> ' + str(file_pattern)+ '\t  <Provide appropriate Name>'
   sys.exit(1)