查找名称中包含最大整数的文件名

时间:2017-04-07 12:49:49

标签: python csv filenames

摘要

如果存在FCR_Network_Coordinates_0和FCR_Network_Coordinates_2,则应写入文件FCR_Network_Coordinates_3而不是FCR_Network_Coordinates_1

详细

我有以下问题:

我想编写一个新的csv文件,如果它不存在,如果在目录中找到某个文件,则增加扩展名。但是,如果作为示例存在具有数字扩展名“1”的文件,并且具有“3”的文件,但是没有具有“2”的文件,则它应该用“4”写下一个文件。所以它应该在最高号码扩展名

中加1

到目前为止我的代码是:

    index = 0
    while os.path.exists('../FCR_Network_Coordinates_'+ str(index) + '.csv'):
        index+=1            
    with open('../FCR_Network_Coordinates_'+str(index)+'.csv', 'wb') as csv_file:
        writer = csv.writer(csv_file, delimiter=";")
        for key, value in sparse1.items():
            writer.writerow(['{:.1f}'.format(t) for t in key]+value)

修改

它也适用于在路径名中添加参数的路径

 "../FCR_Network_Coordinates_"+"r_"+radius+"x_"+x+"y_"+y+"z_"‌​+z+"fcr_"+fcr_size+"‌​_"+new_number+".csv" 

看起来像:

FCR_Network_Coordinates_radius_3_x_0.3_y_0.3_z_2_fcr_2_1.csv

EDIT2

此外,如果文件名中还有其他参数,则不应该查找所有文件的最大数量,而是查找具有这些参数的文件的最大数量

2 个答案:

答案 0 :(得分:3)

您的代码将停止搜索文件" 2" (如果" 2"不存在)即使有文件" 3" &安培; " 4"

您需要使用glob来获取与您的模式匹配的所有文件

import glob
import re
files=glob.glob("../FCR_Network_Coordinates_*.csv")

接下来从文件名中删除所有非数字

file_nums=[]
for i, s in enumerate(files):

    num_str = re.search("(\d+).csv$",  files[i]) #capture only integer before ".csv" and EOL
    file_nums.append(parseInt(num_str.group(1)))  #convert to number

new_number=max(file_nums)+1 #find largest and increment

对文件列表进行排序,以查找编号最高的文件。

答案 1 :(得分:2)

以下内容适用于您:

import glob
import os

# .....

existing_matches = glob.glob('../FCR_Network_Coordinates_*.csv')

if existing_matches:
    used_numbers = []
    for f in existing_matches:
        try:
            file_number = int(os.path.splitext(os.path.basename(f))[0].split('_')[-1])
            used_numbers.append(file_number)
        except ValueError:
            pass
    save_number = max(used_numbers) + 1
else:
    save_number = 1

with open('../FCR_Network_Coordinates_{}.csv'.format(save_number), 'wb') as csv_file:
    writer = csv.writer(csv_file, delimiter=";")
    for key, value in sparse1.items():
        writer.writerow(['{:.1f}'.format(t) for t in key] + value)

glob查找名称与您的模式类似的所有文件,其中*用作通配符。

然后我们使用os.path来操作每个文件名并计算出名称中的数字:

  • os.path.basename()为我们提供了文件名 - 例如'FCR_Network_Coordinates_1.csv'
  • os.path.splitext()从扩展程序('FCR_Network_Coordinates_1')中拆分文件名('.csv')。将索引为0的元素获取文件名而不是扩展名
  • 根据'_'将其拆分,每次有'_'时将其拆分 - 生成['FCR', 'Network', 'Coordinates', '1']列表。获取索引-1将获得此列表中的最后一个条目,即1。
  • 我们必须将其包装为int()以便能够对其应用数字操作。

如果有一些文件名使用字母而不是下划线后面的数字,我们也会收到错误。然后,我们取最大的数字并添加一个。如果没有找到数字,我们使用1作为文件名。

编辑: 在回答问题更新时,我们只需要更改我们的glob和我们写的最终名称 - glob更改为:

existing_matches = glob.glob('../FCR_Network_Coordinates_r_{}_x_{}_y_{}_z_{}_fcr_{}_*.csv'.format(
    radius, x, y, z, fcr_size))

,文件开头行变为:

with open('../FCR_Network_Coordinates_r_{}_x_{}_y_{}_z_{}_fcr_{}_{}.csv'.format(
        radius, x, y, z, fcr_size, save_number), 'wb') as csv_file: