Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python os.rename()之后缺少文件_Python_Python 2.7 - Fatal编程技术网

Python os.rename()之后缺少文件

Python os.rename()之后缺少文件,python,python-2.7,Python,Python 2.7,我有一个for循环,它通过一个目录工作,并从该目录中的每个.tar.gz中提取文件。它将每个.tar.gz中的内容提取到为每个.tar.gz创建的临时目录中,然后重命名它们,以便将它们移动到最终目录 为每个.tar.gz创建临时目录,以便只处理每个目录中的文件。重命名完成后,临时目录将被删除,只会在下一次.tar.gz中再次创建 每个.tar.gz中包含3个文件。这是保证,不是假设 正在发生的事情是重命名后,经过检查,我可能会发现自己在最终目录中缺少1-4个文件。例如,如果我从250个.tar.

我有一个
for
循环,它通过一个目录工作,并从该目录中的每个
.tar.gz
中提取文件。它将每个
.tar.gz
中的内容提取到为每个
.tar.gz
创建的临时目录中,然后重命名它们,以便将它们移动到最终目录

为每个
.tar.gz
创建临时目录,以便只处理每个目录中的文件。重命名完成后,临时目录将被删除,只会在下一次
.tar.gz
中再次创建

每个
.tar.gz
中包含3个文件。这是保证,不是假设

正在发生的事情是重命名后,经过检查,我可能会发现自己在最终目录中缺少1-4个文件。例如,如果我从250个
.tar.gz
文件开始,我应该有750个最终文件,但可能只有746个。由于最终文件被重命名,因此它们与原始文件
.tar.gz
匹配,因此我可以返回并手动解压缩它,以成功检索3个文件

需要了解为什么
os.rename()
方法会这样做

当前代码:

def unzip(in_dir):

    final_dir = os.path.abspath(os.path.join(in_dir, "UNZIPPED\\"))
    temp_dir = os.path.join(in_dir, "TEMP\\")

    os.mkdir(final_dir)

    files = [f for f in os.listdir(in_dir) if f.endswith('.tar.gz')]

    for item in files:
        os.mkdir(temp_dir)
        org_path = os.path.abspath(os.path.join(in_dir, item))
        tar = tarfile.open(org_path, 'r:gz')
        tar.extractall(path=temp_dir)
        tar.close()
        for member in os.listdir(temp_dir):
            new_path= os.path.abspath(os.path.join(temp_dir, member))
            os.rename(new_path, 
                      os.path.join(final_dir,
                                   os.path.basename(org_path)[:-7]+new_path[-4:]))
        os.rmdir(temp_dir)

如果我误用了
os.path.abspath
和/或
os.path.join
请指出。我会认为,通过将
作为
C:\MyPath
之类的东西传递到\u dir中,然后使用
os.path.join(在\u dir中,“unzip\”)
将产生
C:\MyPath\unzip\
,我不需要在它之前使用
os.path.abspath

oslistdir
:输入错误?您可以计算内部循环,看看是否迭代了750次。另外,检查目标文件是否不存在
os.rename
不会覆盖文件,但可能只是实现定义的。还要检查tgz档案中是否没有子文件夹。因为您只扫描提取的目录的根,而不是子目录。请考虑使用<代码> TApField.ExtFiffe()/代码>来提取文件,这将给您一个类似文件的对象,然后您可以用所需的名称写入所需的目录,因此,避免对提取的文件进行所有重命名和移动
tar=tarfile.open(项'r:gz')
不应该是
tar=tarfile.open(组织路径'r:gz')
?即使您需要
os.path.join
来访问由
os.listdir
枚举的文件,也不需要对它们执行
abspath
。无害,但不需要。还要检查文件名,
os.rename()
不会覆盖windows中的文件,但会引发OSError异常,请确保您没有在其他位置捕获它。
oslistdir
:typo?您可以计算内部循环,以查看是否迭代了750次。另外,检查目标文件是否不存在
os.rename
不会覆盖文件,但可能只是实现定义的。还要检查tgz档案中是否没有子文件夹。因为您只扫描提取的目录的根,而不是子目录。请考虑使用<代码> TApField.ExtFiffe()/代码>来提取文件,这将给您一个类似文件的对象,然后您可以用所需的名称写入所需的目录,因此,避免对提取的文件进行所有重命名和移动
tar=tarfile.open(项'r:gz')
不应该是
tar=tarfile.open(组织路径'r:gz')
?即使您需要
os.path.join
来访问由
os.listdir
枚举的文件,也不需要对它们执行
abspath
。无害,但不需要。还要检查文件名,
os.rename()
不会覆盖windows中的文件,但会引发OSError异常,请确保您没有在其他位置捕获它。