我正在编写一个程序,通过查看其标题来输出目录中的文件类型。
有些文件是压缩的,所以我需要能够将它们解压缩为起点
到目前为止,我已经能够搜索目录并使用标题更改扩展名,并打开压缩文件并将其内容存储在变量中,现在我无法将变量保存为新文件。
def unzip():
os.chdir("C:/Users/David/Myfiles")
files = os.listdir(".")
for x in (files):
f = open((x), "rb")
byte1 = f.read(1)
byte2 = f.read(1)
if byte1 == b'\x1f' and byte2 == b'\x8b':
os.rename((x), (x) + ".gz")
file = gzip.open((x), "rb")
content = file.read()
print (content)
我猜我必须使用f.write("newfile", content)
行的命令,但不确定。
提前致谢
答案 0 :(得分:8)
通常,如果变量foo
中有字符串,则可以将其写入文件:
with open('output.file','w') as f:
f.write(foo)
在您的情况下,您不会使用f
,因为您已经使用f
作为输入文件句柄。
我想你想要的东西是:
def unzip():
os.chdir("C:/Users/Luke/Desktop/Cache")
files = os.listdir(".")
for x in (files):
ifh = open((x), "rb")
byte1 = ifh.read(1)
byte2 = ifh.read(1)
if byte1 == b'\x1f' and byte2 == b'\x8b':
os.rename((x), (x) + ".gz")
file = gzip.open((x), "rb")
contents = file.read()
with open('output.file','w') as ofh:
ofh.write(contents)
答案 1 :(得分:1)
with open('filename.whatever', 'wb') as output:
output.write(your_data)
查看http://docs.python.org/2/tutorial/inputoutput.html#reading-and-writing-files
上的文档答案 2 :(得分:1)
您不必查看前两个字节来识别gz文件。相反,我认为更多的“Pythonic”方法是首先尝试,稍后道歉(通常称为"Easier to ask Forgiveness than Permission"):
import os
import bz2
import gzip
def write(filename, content):
with open(filename, 'w') as g:
g.write(content)
def uncompress(dirpath):
for filename in os.listdir(dirpath):
filename = os.path.join(dirpath, filename)
for opener in (gzip.open, bz2.BZ2File):
try:
with opener(filename) as f:
newfile, ext = os.path.splitext(filename)
content = f.read()
os.unlink(filename)
write(newfile, content)
except IOError:
continue
else: # break if try worked without IOError
break
dirpath = "C:/Users/Luke/Desktop/Cache"
uncompress(dirpath)
此外,最好避免在可能的情况下使用os.chdir
,因为即使在离开uncompress
函数后它也会改变当前目录。如果您的脚本处理其他目录,那么您必须在程序的每个阶段仔细控制当前目录。如果您使用os.path.join
,则无需担心当前目录是什么。