我想在一个目录中读取文件。
目录包含:
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
在运行脚本时我想给读取特定文件的命令行参数取决于某些条件:
对于这些东西,我创建了一个脚本,但我面临着问题。
程序 -
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文件。
如何在不失去任何其他条件的情况下满足第二个条件?
答案 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)