![](/img/trans.png)
[英]Python OS - check if file exists, if so rename, check again, then save
[英]How to check if a file exists and if so rename it in python
我正在尋找一種更pythonic的方式來執行我的代碼當前所做的事情。 我相信有更好的方法可以做到這一點。 我想搜索直到filename-10,如果存在,則創建一個名為filename-11的文件。
如果您能提供幫助,那將很好。
編輯:14年9月1日晚上9:46
import re
import os
f=open('/Users/jakerandall/Desktop/Data Collection Python/temp.cnc', 'r')
text = re.search(r"(?<!\d)\d{4,5}(?!\d)", f.read())
JobNumber = text.string[text.start():text.end()]
if os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-10.cnc" % JobNumber):
f=open("/Users/jakerandall/Desktop/Data Collection Python/%s-11.cnc" % JobNumber, 'w+b')
f.close()
print '1'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-9.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-10.cnc' % JobNumber, 'w+b')
f.close()
print '2'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-8.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-9.cnc' % JobNumber, 'w+b')
f.close()
print '3'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-7.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-8.cnc' % JobNumber, 'w+b')
f.close()
print '4'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-6.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-7.cnc' % JobNumber, 'w+b')
f.close()
print '5'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-5.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-6.cnc' % JobNumber, 'w+b')
f.close()
print '6'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-4.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-5.cnc' % JobNumber, 'w+b')
f.close()
print '7'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-3.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-4.cnc' % JobNumber, 'w+b')
f.close()
print '8'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-2.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-3.cnc' % JobNumber, 'w+b')
f.close()
print '9'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s-1.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-2.cnc' % JobNumber, 'w+b')
f.close()
print '10'
elif os.path.isfile("/Users/jakerandall/Desktop/Data Collection Python/%s.cnc" % JobNumber):
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s-1.cnc' % JobNumber, 'w+b')
f.close()
print '11'
else:
f=open('/Users/jakerandall/Desktop/Data Collection Python/%s.cnc' % JobNumber, 'w+b')
f.close()
print '12'
f.close()
簡單的事情如何:
import glob
file_directory = '/Users/jakerandall/Desktop/Data Collection Python/'
files = glob.glob('{}{}*.cnc'.format(file_directory, JobNumber))
現在, files
將是目錄中實際存在並與您的模式匹配的文件名的列表。
您可以檢查此列表的長度,然后:
'{}.cnc'.format(JobNumber)
。 -
,因此長度為11意味着最后一個文件是-10.cnc
)。 -4.cnc
(因為該模式也將匹配第一個文件)。 您仍然需要查看是否可以打開它們,因為運行Python腳本的用戶可能沒有足夠的權限。
這是將所有內容放在一起的示例:
import glob
file_directory = '/Users/jakerandall/Desktop/Data Collection Python/'
files = glob.glob('{}{}*.cnc'.format(file_directory, JobNumber))
# Start by assuming there are no files:
filename = '{}.cnc'.format(JobNumber)
if len(files) <= 11:
# If there are less than 11 files, we need
# to use the existing file, and overwrite it
# If there are 4 files, in the directory, our
# list will have a length of 5:
# The original file, and then four files from -1, to -4
# In this case, we want to use file 4, which is 1 less than
# the length of the list:
filename = '{}-{}.cnc'.format(JobNumber, len(files)-1)
else:
# If we reach this point, it means
# there were more than 10 files that match the
# pattern. We want to use the next file,
# which is next number higher, which is also the length
# of the list, since it will include the first file.
# So if the last file is -20, the list will have 20 files (from -1, to -20)
# plus the original file, which has no - in the filename, giving
# a length of 21, which also happens to be the number of the file
# we want to create :)
filename = '{}-{}.cnc'.format(JobNumber, len(files))
# Now, try to create the file
try:
f = open(filename, 'w+b')
except IOError:
print('Cannot create {}, check permissions?'.format(filename))
我實際上已經寫過這樣的東西! 我雖然從內存中工作。 這作為單獨的模塊很有用,因為以這種方式備份文件非常普遍。
# /backup_dash_one.py
import os, glob, re
def backup(full_path, num_backups=None):
"""Usage: backup('example/pathname.ext', [num_backups])
returns: example/pathname-1.ext, advances all backups by 1
Given example/pathname.ext, creates backups named
example/pathname-1.ext, -2.ext, -3.ext until there are
as many backups as num_backups, purging those older."""
head, tail = os.path.split(full_path)
tailname, tailext = os.path.splitext(tail)
def find_backup_num(path):
return int(re.search(r"-(\d+)\.[^.\\/]*", path).group(1))
paths = sorted(glob.glob(os.path.join(head,tailname)+"-*"+tailext),
key=find_backup_num)
for path in reversed(paths[:]):
head_tail, backup_num, ext, _* = re.split(r"-(\d+)(\.[^\\./]*)$", path)
new_path = head_tail + "-" + str(int(backup_num)+1) + ext
with open(path) as infile, open(new_path,'w') as outfile):
for line in infile:
outfile.write(line)
if new_path not in paths:
paths.append(new_path)
while num_backups and len(paths) > num_backups:
os.remove(paths[-1])
paths.pop()
就我個人而言,如果我真的有時間致力於這一工作,那么我將做更多的研究,並做一些類似的事情:
import glob, os
class BackupFile(object):
def __init__(self, path, mode="w", num_backups=None):
self.num_backups = num_backups
path_filename, ext = os.path.splitext(path)
self.backups = glob.glob(path_filename+"-*"+ext)
self.backups.sort(key=self.find_backup_num)
self.backup()
self.purge()
with open(path_filename+"-1"+ext, 'w') as backup,\
open(path, 'r') as original:
for line in original:
backup.write(line)
self.f = open(path, mode)
def find_backup_num(self,filename):
return int(os.path.splitext(filename)[0].split('-')[-1])
def backup(self):
for path in reversed(self.backups[:]):
head_num,ext = os.path.splitext(path)
*head,num = head_num.split('-')
new_path = "{}-{}{}".format('-'.join(head),
int(num)+1,
ext)
with open(new_path, 'w') as newfile, \
open(path, 'r') as oldfile:
for line in oldfile:
newfile.write(line)
if new_path not in self.backups:
self.backups.append(new_path)
def purge(self):
while self.num_backups and len(self.backups) > self.num_backups:
os.remove(self.backups.pop())
def __enter__(self):
return self.f
def __exit__(self, exc_type, exc_value, exc_traceback):
self.f.close()
因此,您可以這樣做:
with BackupFile("path/to/file/that/needs/backups.txt", 'r+', num_backups=12) as f:
make_change(f)
# ta-da it's backed up!
但是我根本沒有太多機會來測試它,所以我猜想它確實有問題:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.