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

Why renaming gzip file using Python is not renaming the actual file in Windows?

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

代码:

result_file = "C:\Users\xyz\test_data.csv.zip.filepart"
with gzip.open(result_file, "wb") as f_res:
    f_res.write("some data".encode())
# Rename after successfully writing into file
os.rename(result_file, result_file[:len(result_file)-len('.filepart')])

成功执行上述代码后,在 Windows 中,它创建了一个名为“test_data.csv.zip”的文件,在解压该文件后,我得到了带有“一些数据”字符串的实际 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 模块来编写您的 CSV与 Excel 兼容的 Unicode 字符串。由于非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')