Shutil.copy导致文件数据删除

时间:2014-02-24 19:39:53

标签: python

我正在使用shutil.copy将一个文件的内容复制到另一个文件。但是它导致我的orignal文件被删除,错误为“文件中没有数据”

我第一次尝试了这个

    import shutil
    shutil.copy('keywords.txt', 'keywordsfinal.txt')

然后被告知文件需要以可写格式打开

    import shutil
    ab = open("keywords.txt","w")
    abc = open("keywordsfinal.txt","w")
    shutil.copy('keywords.txt', 'keywordsfinal.txt')
    ab.close()
    abc.close()

但是对于这两个代码,即使我在每个.txt文件中都有某些内容,例如test1和test2,这两个文件都将返回空。

我之前有这个工作,大约6个月后回到我的程序中找到这个错误。任何帮助赞赏。

最近,下面的错误也开始显现,我不知道它是什么,以及它是否与我的代码有任何关联。

 Traceback (most recent call last):
   File "C:\Python33\lib\random.py", line 249, in choice
     i = self._randbelow(len(seq))
   File "C:\Python33\lib\random.py", line 225, in _randbelow
     r = getrandbits(k)          # 0 <= r < 2**k
 ValueError: number of bits must be greater than zero

 During handling of the above exception, another exception occurred:

 Traceback (most recent call last):
   File "C:\Users\*******\Desktop\*******\*********Python\new\Final - Copy.py", line      84, in <module>
     a = random.choice(list(f)).strip() #.strip cleans the line \n problem
   File "C:\Python33\lib\random.py", line 251, in choice
     raise IndexError('Cannot choose from an empty sequence')
 IndexError: Cannot choose from an empty sequence

3 个答案:

答案 0 :(得分:2)

您需要先关闭文件句柄,然后才能使用shutil。如果您在使用copy()之前没有关闭文件句柄,shutil将只创建目标文件但它将保持为空。

上面的代码应如下所示:

import shutil
ab = open("keywords.txt","w")
abc = open("keywordsfinal.txt","w")
ab.close()
abc.close()
shutil.copy('keywords.txt', 'keywordsfinal.txt')

答案 1 :(得分:1)

  1. 您不应该在shutil.copy()之前打开文件。
  2. 对于第二个问题,看起来list(f)为空。

答案 2 :(得分:1)

shutil.copy()接受文件名(字符串)作为参数。它会为您打开文件。您可能会将其与接受文件对象的shutil.copyfileobj()混淆。即使使用copyfileobj(),也不应对要复制的文件使用"w"模式(第一个参数,即源代码)。

"w"模式(代表"write")表示"open for writing, truncating the file first"(使文件为空)。

#XXX REMOVE THIS CODE, IT DESTROYS THE FILES
ab = open("keywords.txt","w")
abc = open("keywordsfinal.txt","w")

注意:从代码中删除有问题的行不会还原文件。一旦它们空了;他们一直都是空的。你需要重新填充它们。它应该解决你的第二个问题:用空列表调用random.choice()

>>> import random
>>> random.choice([])
Traceback (most recent call last):
  File "/usr/lib/python3.2/random.py", line 249, in choice
    i = self._randbelow(len(seq))
  File "/usr/lib/python3.2/random.py", line 225, in _randbelow
    r = getrandbits(k)          # 0 <= r < 2**k
ValueError: number of bits must be greater than zero

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python3.2/random.py", line 251, in choice
    raise IndexError('Cannot choose from an empty sequence')
IndexError: Cannot choose from an empty sequence