如何在文件中使用Python匹配文件名
如何判断两个文件是否在一个文件中存在相同的模式。如果所有文件名都有一对文件(一个是 csv.new,另一个是 csv),那么就可以继续下一步,否则就退出并显示错误信息。
比如,前缀是 "abc_package" 的文件会有两个,一个是 "csv.new" 后缀,另一个是 "csv" 后缀。在 "list_of_files.txt" 文件中可能会有很多文件名。
例如:List_of_files.txt
abc_package.1406728501.csv.new
abc_package.1406728501.csv
abc_package.1406724901.csv.new
abc_package.1406724901.csv
3 个回答
0
假设这个文件不是大得离谱,导致你无法把它放进内存里,你可以先创建一个包含所有 .csv.new
文件的集合,再创建一个包含所有 .csv
文件的集合,然后检查这两个集合是否完全相同。例如:
csvfiles = set()
newfiles = set()
with open('List_of_files.txt') as f:
for line in f:
line = line.rstrip()
if line.endswith('.csv.new'):
newfiles.add(line[:-4])
elif line.endswith('.csv'):
csvfiles.add(line)
if csvfiles != newfiles:
raise ValueError('Mismatched files!')
如果你想知道哪些文件不匹配,使用 csvfiles - newfiles
可以找出那些没有对应 .csv.new
文件的 .csv
文件,而 newfiles - csvfiles
则可以找出没有对应 .csv
文件的 .csv.new
文件。
(其实还有其他方法可以让这个过程更简洁易懂,比如使用 os.path.splitext
或者用一个通用的按过滤条件分割可迭代对象的函数,但我觉得这个方法对于新手来说是最容易理解的。)
1
with open("in.txt","r") as fo:
f = fo.readlines()
cs_new = set()
cs = set()
for ele in f:
ele = ele.rstrip()
if not ele.endswith(".new"):
cs.add(ele)
else:
cs_new.add(ele.split(".new")[0])
diff = cs ^ cs_new
for fi in diff:
print fi
因为你需要文件名,所以你需要检查这两个列表中是否都有这个文件名:
with open("in.txt","r") as f:
f = [x.rstrip() for x in f]
cs, cs_new, diff = [],[],[]
for ind, ele in enumerate(f):
if ele.endswith(".csv"):
cs.append(ele)
else:
cs_new.append([ele.split(".new")[0],ind]) # keep track of original element in with the ind/index
for ele in cs:
if not any(ele in x for x in cs_new):
diff.append(ele)
for ele in cs_new:
if not any(ele[0] in x for x in cs):
diff.append(f[ele[1]]) # append original element with full extension