如果存在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
此外,如果文件名中还有其他参数,则不应该查找所有文件的最大数量,而是查找具有这些参数的文件的最大数量
答案 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: