Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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重命名gzip文件不是在Windows中重命名实际文件?_Python_Python 3.x_Windows_Gzip - Fatal编程技术网

为什么使用Python重命名gzip文件不是在Windows中重命名实际文件?

为什么使用Python重命名gzip文件不是在Windows中重命名实际文件?,python,python-3.x,windows,gzip,Python,Python 3.x,Windows,Gzip,我正在使用Python3.7的gzip模块写入一个压缩文件,然后重命名该文件。这里的期望是它也应该重命名文件的实际名称,但在Windows中不会发生这种情况。(在Linux中,它按预期工作。) 代码: 成功执行上述代码后,在Windows中,它会创建一个名为“test_data.csv.zip”的文件,提取该文件后,我会得到带有“some data”字符串的实际csv,但文件名仍然是“test_data.csv.zip.filepart”,而在Linux中,提取后,我会得到“test_data.

我正在使用Python3.7的gzip模块写入一个压缩文件,然后重命名该文件。这里的期望是它也应该重命名文件的实际名称,但在Windows中不会发生这种情况。(在Linux中,它按预期工作。)

代码:

成功执行上述代码后,在Windows中,它会创建一个名为“test_data.csv.zip”的文件,提取该文件后,我会得到带有“some data”字符串的实际csv,但文件名仍然是“test_data.csv.zip.filepart”,而在Linux中,提取后,我会得到“test_data.csv”这是预期的结果


有没有办法在Windows中也获得相同的行为?

如果希望使用中间名,如以后重命名的
data.csv.filepart
,则将中间文件作为二进制文件打开,并构造一个
GzipFile
,指定所需的未压缩文件名并传入文件对象:

import gzip
import os

with open('data.csv.filepart','wb') as f:
    with gzip.GzipFile(filename='data.csv',mode='wb',fileobj=f) as g:
        g.write(b'some data')

os.rename('data.csv.filepart','data.csv.gz')
写入时文件名为“data.csv.filepart”,完成时文件名为“data.csv.gz”,并提取到“data.csv”

或者,如果希望进行文本处理而不是二进制处理,请将
GzipFile
对象包装在
TextIOWrapper
中,如果需要,可以使用
csv
模块使用与Excel兼容的Unicode字符串编写csv。由于非ASCII字符,请确保以UTF-8编码保存源:

import gzip
import os
import io
import csv

with open('data.csv.filepart','wb') as f:
    with gzip.GzipFile(filename='data.csv',mode='wb',fileobj=f) as g:
        with io.TextIOWrapper(g,encoding='utf-8-sig',newline='') as t:
            w = csv.writer(t)
            w.writerow(['Header1','Header2','Header3'])
            w.writerow(['data1','你好吗?','\N{PILE OF POO}'])

os.rename('data.csv.filepart','data.csv.gz')

Windows
可能有点宽泛,请分享更多关于代码失败的Windows配置、您尝试过的Windows版本、您尝试过的任何解决方案以及它们是如何失败的。听起来Windows是基于gzip头来命名文件的。您可以事先打开该文件,将其作为
fileobj=..
传递,然后将
filename=..
设置为您希望它在gzip文件中包含的文件名。您不应该调用gzip文件“.zip”。正确的后缀是“.gz”。zip文件和gzip文件是两个完全不同的东西。当我在Windows 10上运行代码时,Python 3.9编写了文件,并对其进行了重命名,但并不像您预期的那样。对我来说,它将文件重命名为
test_data.csv.zip
,这是我阅读代码时所期望的。我不太明白为什么您希望代码将文件名截断9个字符(
len(.filepart')
)以删除后缀
“.zip.filepart”
。在
.gz
文件中,文件名是
test\u data.csv.zip.filepart
,但这是
os.rename()
将不知道如何更改。根据我的使用案例,“filepart”应该是写入文件时文件名的后缀或前缀(或知道文件不是完整文件的任何地方),一旦写入成功,则“filepart”应该是“应删除后缀。所以,这个解决方案在我的情况下不起作用。@JayShah请参阅使用
GzipFile
构造进行编辑。这确实很有帮助。非常感谢。
import gzip
import os
import io
import csv

with open('data.csv.filepart','wb') as f:
    with gzip.GzipFile(filename='data.csv',mode='wb',fileobj=f) as g:
        with io.TextIOWrapper(g,encoding='utf-8-sig',newline='') as t:
            w = csv.writer(t)
            w.writerow(['Header1','Header2','Header3'])
            w.writerow(['data1','你好吗?','\N{PILE OF POO}'])

os.rename('data.csv.filepart','data.csv.gz')