【发布时间】:2015-10-11 08:53:28
【问题描述】:
我经常会丢失我尝试使用 shutil copyfile 复制的文件的最后几 kb。
我做了一些研究,确实看到有人在这里问过类似的问题: python shutil copy function missing last few lines
但我使用的是 copyfile,它似乎使用了 with 语句...
with open(src, 'rb') as fsrc:
with open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)
所以我很困惑更多的用户没有遇到这个问题,如果它确实是某种缓冲问题 - 我认为它会更广为人知。
我非常简单地调用 copyfile,不要认为我可能做错了什么,基本上按照我认为的标准方式来做:
copyfile(target_file_name,dest_file_name)
但我每次都缺少文件的最后 4kb 左右。
我也没有接触过在shutil中调用的copyfile函数……
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)
所以我很茫然,但我想我将要学习一些关于刷新、缓冲或 with 语句的知识,或者......帮助!谢谢
致阿南德: 阿南德,我避免提及那些东西,因为我觉得这不是问题,但既然你问了......执行摘要是我正在从 FTP 抓取一个文件,检查该文件是否与我上次保存的文件不同复制,如果是,下载文件并保存副本。这是一个迂回的意大利面条代码,我猜是在我是一个真正纯粹的功利主义新手时编写的。它看起来像:
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
【问题讨论】:
-
您能否展示更多代码,您是如何创建
target_file_name的,以及您是如何创建 target_file 本身的? -
是否有一个特定的文件总是会发生这种情况?你在什么操作系统上,什么蟒蛇?你能发布一个它总是这样做的文件吗?您是在尝试写入网络驱动器还是什么?
-
阿南德,我在帖子中回复了你,不知道该怎么做,因为评论的字符太多。
-
Joran,几乎每次都在发生。也许每几百个文件中就有一个可以正常工作。操作系统是windows 7 pro,python是2.7。是的,写入网络驱动器。这些文件是 XML 文件。基本上我经常会错过 XML 的最后 10-50 行。
-
@10mjg 尝试做 -
fhandle.flush()之后 -ftp.retrbinary('RETR %s' % filename, fhandle.write)。
标签: python shutil file-copying