Python shutil copyfile - 缺少最后几行
Python shutil copyfile - missing last few lines
我经常丢失我尝试使用 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 中调用的复制文件函数,它是...
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
This 看起来有更好的嵌套方法 withs
:
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)
我会尝试更多类似的东西。我远非专家,希望有更多知识的人可以提供一些见解。我最好的想法是内部 with
在外部关闭之前关闭。
您正在尝试复制未关闭的文件。这就是缓冲区未被刷新的原因。将 copyfileobj
移出 with
块,以允许 fhandle
关闭。
做:
with open(target_file_name ,'wb') as fhandle:
ftp.retrbinary('RETR %s' % filename, fhandle.write)
# and here the rest of your code
# so fhandle is closed, and file is stored completely on the disk
这里的问题很可能是,在执行行 -
时
ftp.retrbinary('RETR %s' % filename, fhandle.write)
这是使用 fhandle.write()
函数将数据从 ftp 服务器写入文件(名称为 - target_file_name
),但是当您调用 -shutil.copyfile
- fhandle
的缓冲区尚未完全刷新,因此您在复制文件时遗漏了一些数据。
为确保不会发生这种情况,您可以将 copyfile
逻辑移出 fhandle
的 with
块。
或者您可以在复制文件之前调用 fhandle.flush()
刷新缓冲区。
我认为关闭文件会更好(将逻辑移出 with
块)。示例 -
for filename in ftp.nlst(filematch):
target_file_name = os.path.basename(filename)
with open(target_file_name ,'wb') as fhandle:
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
我经常丢失我尝试使用 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 中调用的复制文件函数,它是...
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
This 看起来有更好的嵌套方法 withs
:
with open(src, 'rb') as fsrc, open(dst, 'wb') as fdst:
copyfileobj(fsrc, fdst)
我会尝试更多类似的东西。我远非专家,希望有更多知识的人可以提供一些见解。我最好的想法是内部 with
在外部关闭之前关闭。
您正在尝试复制未关闭的文件。这就是缓冲区未被刷新的原因。将 copyfileobj
移出 with
块,以允许 fhandle
关闭。
做:
with open(target_file_name ,'wb') as fhandle:
ftp.retrbinary('RETR %s' % filename, fhandle.write)
# and here the rest of your code
# so fhandle is closed, and file is stored completely on the disk
这里的问题很可能是,在执行行 -
时ftp.retrbinary('RETR %s' % filename, fhandle.write)
这是使用 fhandle.write()
函数将数据从 ftp 服务器写入文件(名称为 - target_file_name
),但是当您调用 -shutil.copyfile
- fhandle
的缓冲区尚未完全刷新,因此您在复制文件时遗漏了一些数据。
为确保不会发生这种情况,您可以将 copyfile
逻辑移出 fhandle
的 with
块。
或者您可以在复制文件之前调用 fhandle.flush()
刷新缓冲区。
我认为关闭文件会更好(将逻辑移出 with
块)。示例 -
for filename in ftp.nlst(filematch):
target_file_name = os.path.basename(filename)
with open(target_file_name ,'wb') as fhandle:
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