如何在文件中使用Python匹配文件名

2 投票
3 回答
20373 浏览
提问于 2025-04-18 15:31

如何判断两个文件是否在一个文件中存在相同的模式。如果所有文件名都有一对文件(一个是 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 或者用一个通用的按过滤条件分割可迭代对象的函数,但我觉得这个方法对于新手来说是最容易理解的。)

6

在Python中,如果你想匹配文件名,可以使用 fnmatch 模块。我会给你提供一个文档中的示例代码。

import fnmatch
import os

for file in os.listdir('.'):
if fnmatch.fnmatch(file, '*.txt'):
    print file

它的语法是 fnmatch.fnmatchcase(filename, pattern)

如果想看更多例子,可以点击 这里

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

撰写回答