为什么使用 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')
我正在使用 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')