【问题标题】:How to read files in the directory using glob pattern in python?如何在 python 中使用 glob 模式读取目录中的文件?
【发布时间】:2016-12-03 00:23:23
【问题描述】:

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

目录包含:

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。

为此,我创建了一个脚本,但我遇到了问题。

程序-

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

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

【问题讨论】:

  • 我会说像 test.py ABC1 这样的调用不会像预期的那样返回 ABC11.csv 而是 ABC1_*.csv。但是,与您的问题文本相反,它不会返回 ABC1.csv。您的示例代码版本是否符合问题?
  • @Jesper Freesbug- 是的,对...如果我们删除(_),那么它将返回 ABC1.csv、ABC11.csv、ABC11_1.csv 以及所有以 ABC1 开头的内容。但是我想要清楚地解释问题,如果你有任何建议?

标签: python file directory glob


【解决方案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

【讨论】:

    【解决方案2】:

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

    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 有同样的问题。问题是虽然 * 会匹配任何字符,但它需要 a 字符!

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

    【讨论】:

    • @dodell- 是的,这是不正确的。我想满足我所有的条件。
    • @doell- 得到了正确的解决方案。请看我的回答。
    【解决方案3】:

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

    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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-06
      • 1970-01-01
      • 2023-01-02
      • 2010-10-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2018-11-14
      相关资源
      最近更新 更多