Python - 将变量连接成字符串格式

时间:2014-10-20 05:34:20

标签: python

我试图从文件中检索数字,并确定其填充,因此我可以将其应用于新文件名,但添加了数字。我基本上试图做一个文件保护程序。

例如:

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

我希望这很清楚,我很难说清楚这一点。

提前感谢您的帮助。

干杯!

5 个答案:

答案 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'

可能进行一些其他改进:

  1. 可选的arg,用于指定要添加到当前文件的编号 号码,
  2. 可选的arg,用于指定文件的最小宽度 数字字符串,
  3. 改进了奇怪数字/位置的名称处理 下划线。