2015-08-07 2 views
1

У меня есть имя файла, который выглядит какПереименовать файл с рисунком

er-log-0.0.1-20150807.194034-8.jar 

Формат следует, как

artifactId-version-timestamp.jar 

Я хочу переименовать это artifactId.jar.

Я попытался

>>> fname = "er-log-0.0.1-20150807.194034-8.jar" 
>>> import os 
>>> os.rename("er-log*", "er-log.jar") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
OSError: [Errno 2] No such file or directory 

Файл находится в текущей директории, хотя

+1

Вы пытаетесь переименовать каждый файл, который соответствует вашему шаблону в определенной директории? –

+0

Существует только один, и он будет всегда, его артефакт maven – daydreamer

+0

Возможный дубликат [Открыть файл, зная только часть его имени] (http://stackoverflow.com/questions/18433177/open-file-knowing- only-a-part-of-its-name) - это показывает множество способов получить имя файла, когда вы только знаете его часть. Вы можете использовать эти ответы, чтобы перейти к тому, что вы просто называете 'os.rename', а не' open'. –

ответ

1

Вам нужно glob, если вы хотите, чтобы найти все файлы с помощью оболочки подстановочные:

import os 
from glob import glob 
path = "/path_to_files" 

f = glob(os.path.join(path,"er-log*"))[0] 
os.rename(f, os.path.join(path,"er-log.jar")) 

Использование "er-log*" с os.rename, python ищет файл, который называется "er-log*".
Если вы запустите код из той же директории, что вам не нужно, чтобы присоединиться к пути, только os.rename(f, "er-log.jar")

+0

@JakeGriffin, yep, на самом деле получается только один файл –

+0

@JakeGriffin, как вы думаете, '' er-log * "' делает в коде OPs? –

+0

@JakeGriffin, '-0.0.1' изменяет не' er-log' в соответствии с собственным кодом OPs, это делает именно то, что задано и что пытается сделать OP с помощью переименования –

0
import os 
direc = "C:\\" 
for file in next(os.walk(direc))[2]: 
    if file.endswith(".jar"): 
     os.rename(os.path.join(direc, file), os.path.join(direc, "artifactId.jar")) 
    break 

Изменить C: \ к вашему разыскиваемого пути :)

0

Вот как я бы выполните свою задачу в удобной для пользователя форме.

Примечание:

  • полагается на пользователь, чтобы указать имя файла, используя wildards, если он любит.
  • Я использую модуль re, чтобы определить, соответствует ли имя переданного имени вашему шаблону и извлекает корень имени файла.

Типичные случаи использования:

# This one is particularly useful if the user has tab expansion 
# in his shell. Tab expasion makes it easy to specify 
# a single file name. 
python rename_artifact.py er-log-0.0.1-20150807.194034-8.jar 

# Or the user can glob the filename. "-n" and "-v" make it 
# easy to see what the script would do/actually does. 
python -n *.jar 
python -v *.jar 

Код:

import argparse 
import re 
import os 


# Take a passed-in arg, confirm it matches 
# the pattern, and add the new file name 
def artifact(old_filename): 
    # Adjust regular expression to taste 
    result = re.match('(.*)-[0-9.]+-\d+\.\d+-\d+(\.jar)', old_filename) 
    if not result: 
     raise argparse.ArgumentTypeError(
      "bad file name: {}".format(old_filename)) 
    new_filename = ''.join(result.groups()) 
    return old_filename, new_filename 

parser = argparse.ArgumentParser(
    description='Rename files to avoid timestamps') 
parser.add_argument('-n', '--dry-run', 
        action='store_true', 
        help="Don't actually run any commands; just print them.") 
parser.add_argument('-v', '--verbose', 
        action='store_true', 
        help='Verbosely list the files processed') 
parser.add_argument(
    'FILE', 
    help='File name, like er-log-0.0.1-20150807.194034-8.jar', 
    nargs='+', 
    type=artifact) 
args = parser.parse_args() 

for rename in args.FILE: 
    if args.dry_run or args.verbose: 
     print 'rename({},{})'.format(*rename) 
    if not args.dry_run: 
     os.rename(*rename) 
Смежные вопросы