我试图从文件中检索数字,并确定其填充,因此我可以将其应用于新文件名,但添加了数字。我基本上试图做一个文件保护程序。
例如:
fileName_0026
0026 = 4位
将当前数字加1并保持相同的数字
结果应为0027及以上。
我尝试做的是从文件中检索填充号码并使用'%04d'%27字符串格式。我已经尝试过我所知道的一切(我的知识非常有限),但没有任何作用。我到处寻找无济于事。
我尝试做的事情是这样的:
O=fileName_0026
P=Retrieved padding from original file (4)
CN=retrieve current file number (26)
NN=add 1 to current file number (27)
'%0 P d' % NN
Result=fileName_0027
我希望这很清楚,我很难说清楚这一点。
提前感谢您的帮助。
干杯!
答案 0 :(得分:1)
这里有一些事情发生,所以这里是我的方法和一些评论。
def get_next_filename(existing_filename):
prefix = existing_filename.split("_")[0] # get string prior to _
int_string = existing_filename.split("_")[-1].split(".")[0] # pull out the number as a string so we can extract an integer value as well as the number of characters
try:
extension = existing_filename.split("_")[-1].split(".")[-1] # check for extension
except:
extension = None
int_current = int(int_string) # integer value of current filename
int_new = int(int_string) + 1 # integer value of new filename
digits = len(int_string) # number of characters/padding in name
formatter = "%0"+str(digits)+"d" # creates a statement that int_string_new can use to create a number as a string with leading zeros
int_string_new = formatter % (int_new,) # applies that format
new_filename = prefix+"_"+int_string_new # put it all together
if extension: # add the extension if present in original name
new_filename += "."+extension
return new_filename
# since we only want to do this when the file already exists, check if it exists and execute function if so
our_filename = 'file_0026.txt'
while os.path.isfile(our_filename):
our_filename = get_next_filename(our_filename) # loop until a unique filename found
答案 1 :(得分:0)
我正在写一些提示来实现这一目标。目前还不清楚你想要达到的目的是什么?
fh = open("fileName_0026.txt","r") #Read a file
t= fh.read() #Read the content
name= t.split("_|.") #Output:: [fileName,0026,txt]
n=str(int(name[1])+1) #27
s= n.zfill(2) #0027
newName= "_".join([fileName,s])+".txt" #"fileName_0027.txt"
fh = open(newName,"w") #Write a new file*emphasized text*
答案 2 :(得分:0)
使用字符串
中的rjust
函数
O=fileName_0026
P=Retrieved padding from original file (4)
CN=retrieve current file number (26)
NN=add 1 to current file number (27)
new_padding = str(NN).rjust(P, '0')
Result=fileName_ + new_padding
答案 3 :(得分:0)
import re
m = re.search(r".*_(0*)(\d*)", "filenName_00023")
print m.groups()
print("fileName_{0:04d}".format(int(m.groups()[1])+1))
{0:04d}
表示用前导零填充四位数字。
答案 4 :(得分:0)
正如您所看到的,有几种方法可以完全相同。但是其他答案没有提到的一件事是,在将文件的数字字符串转换为int
之前,从文件的数字字符串中删除任何现有的前导零是很重要的,否则它将被解释为八进制。
修改
我刚刚意识到,如果文件编号为零,我之前的代码会崩溃! :尴尬:
这是一个更好的版本,也可以处理丢失的文件编号和带有多个或没有下划线的名称。
#! /usr/bin/env python
def increment_filename(s):
parts = s.split('_')
#Handle names without a number after the final underscore
if not parts[-1].isdigit():
parts.append('0')
tail = parts[-1]
try:
n = int(tail.lstrip('0'))
except ValueError:
#Tail was all zeroes
n = 0
parts[-1] = str(n + 1).zfill(len(tail))
return '_'.join(parts)
def main():
for s in (
'fileName_0026',
'data_042',
'myfile_7',
'tricky_99',
'myfile_0',
'bad_file',
'worse_file_',
'_lead_ing_under_score',
'nounderscore',
):
print "'%s' -> '%s'" % (s, increment_filename(s))
if __name__ == "__main__":
main()
<强>输出强>
'fileName_0026' -> 'fileName_0027'
'data_042' -> 'data_043'
'myfile_7' -> 'myfile_8'
'tricky_99' -> 'tricky_100'
'myfile_0' -> 'myfile_1'
'bad_file' -> 'bad_file_1'
'worse_file_' -> 'worse_file__1'
'_lead_ing_under_score' -> '_lead_ing_under_score_1'
'nounderscore' -> 'nounderscore_1'
可能进行一些其他改进: