Je manque régulièrement les derniers kb d'un fichier que j'essaie de copier en utilisant shutil copyfile.Python shutil copyfile - manque les dernières lignes
je fait quelques recherches et ne voient quelqu'un à propos de quelque chose de semblable demander ici: python shutil copy function missing last few lines
Mais j'utilise copyfile, qui ne semble utiliser avec une déclaration ...
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)
Je Je suis perplexe que plus d'utilisateurs n'ont pas ce problème, si en effet c'est une sorte de problème de mise en mémoire tampon - je pense que ce serait plus connu.
J'appelle copyfile très simplement, ne pense pas que je pourrais peut-être en train de faire quelque chose de mal, en faisant essentiellement les choses comme je pense que la norme:
copyfile(target_file_name,dest_file_name)
Pourtant, je suis absent la dernière 4kb ou si la fichier chaque fois.
J'ai pas touché la fonction copyfile qui est appelée à shutil qui est ...
def copyfileobj(fsrc, fdst, length=16*1024):
"""copy data from file-like object fsrc to file-like object fdst"""
while 1:
buf = fsrc.read(length)
if not buf:
break
fdst.write(buf)
Je suis à une perte, mais je suppose que je suis sur le point d'apprendre quelque chose sur le rinçage, mise en mémoire tampon, ou avec la déclaration, ou ... Aidez! grâce
à Anand: Anand, j'évité de mentionner ce genre de choses avant notre ère, il est mon sens que ce n'est pas le problème, mais puisque vous avez demandé ... résumé est que je suis Récolter un fichier à partir d'un FTP, la vérification si le fichier est différent de la dernière fois que j'ai enregistré une copie, si c'est le cas, téléchargez le fichier et enregistrez une copie. C'est un code de spaghetti détourné et il a été écrit quand j'étais un novice utilitaire vraiment pur d'un codeur je suppose. Il ressemble à:
for filename in ftp.nlst(filematch):
target_file_name = os.path.basename(filename)
with open(target_file_name ,'wb') as fhandle:
try:
ftp.retrbinary('RETR %s' % filename, fhandle.write)
the_files.append(target_file_name)
mtime = modification_date(target_file_name)
mtime_str_for_file = str(mtime)[0:10] + str(mtime)[11:13] + str(mtime)[14:16] + str(mtime)[17:19] + str(mtime)[20:28]#2014-12-11 15:08:00.338415.
sorted_xml_files = [file for file in glob.glob(os.path.join('\\\\Storage\\shared\\', '*.xml'))]
sorted_xml_files.sort(key=os.path.getmtime)
last_file = sorted_xml_files[-1]
file_is_the_same = filecmp.cmp(target_file_name, last_file)
if not file_is_the_same:
print 'File changed!'
copyfile(target_file_name, '\\\\Storage\\shared\\'+'datebreaks'+mtime_str_for_file+'.xml')
else:
print 'File '+ last_file +' hasn\'t changed, doin nothin'
continue
Pouvez-vous montrer plus de votre code, comment vous créez le 'target_file_name', ainsi que la façon dont vous créez le target_file lui-même? –
Y at-il un fichier spécifique avec lequel il arrive toujours? quel os êtes-vous et quel python? pouvez-vous poster un fichier avec lequel il le fait toujours? essayez-vous d'écrire sur un lecteur réseau ou quelque chose? –
Anand, je vous ai répondu dans le post, n'était pas sûr de savoir comment faire d'autres bc trop de caractères pour un commentaire. – 10mjg