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

2024-10-06 06:29:09 发布

您现在位置:Python中文网/ 问答频道 /正文

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

目录包含:

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。在

对于这些东西,我创造了一个脚本,但我面临的问题。在

程序-

^{pr2}$

这个代码运行良好,但它不满足我的第二个条件。当用户将ABC1作为参数时,即python测试.pyABC1,它将返回ABC1_1.csv、ABC1_2.csv文件,但不返回ABC1.csv文件。在

我怎样才能同时满足第二个条件而不失去任何其他条件?在


Tags: 文件csv命令行用户程序目录脚本参数
3条回答

我有个解决办法。这并不完美,取决于文件夹中是否有其他文件:

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']

我和杰斯帕有同样的问题。问题是,尽管*将匹配任何字符,但它需要一个a字符!在

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

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

如果用户输入的If not file在指定的目录中不可用,那么我将检查带有(u)符号的文件,然后将所有文件放入列表中。最后迭代列表得到最终结果。在

程序-

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文件。在

输出方案:

^{pr2}$

您可能需要为附加的“特殊”情况添加一个简单的检查,如下所示:

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)

相关问题 更多 >