我注意到我有两种方法可以在python脚本中写入Linux中的文件。我可以创建一个Popen对象并使用shell重定向写入文件(例如“>”或“>>”) - 或者我可以使用文件对象(例如open(),write(),close()) 。
我已经和他们玩了一会儿,并注意到如果我需要使用其他shell工具,使用Popen会涉及更少的代码。例如,下面我尝试获取文件的校验和,并将其写入以PID命名的临时文件作为唯一标识符。 (我知道如果我再次打电话给Popen但是假装我不需要,则会改变:)
Popen("md5sum " + filename + " >> /dir/test/$$.tempfile", shell=True, stdout=PIPE).communicate()[0]
下面是使用文件对象的(草率编写的)粗略等价物。我使用os.getpid而不是$$但我仍然使用md5sum并且必须仍然打电话给Popen。
PID = str(os.getpid())
manifest = open('/dir/test/' + PID + '.tempfile','w')
hash = Popen("md5sum " + filename, shell=True, stdout=PIPE).communicate()[0]
manifest.write(hash)
manifest.close()
这两种方法都有任何优点/缺点吗?我实际上是尝试将bash代码移植到Python并希望使用更多Python,但我不确定我应该采用哪种方式。
答案 0 :(得分:2)
一般来说,我会写一些类似的东西:
manifest = open('/dir/test/' + PID + '.tempfile','w')
p = Popen(['md5sum',filename],stdout=manifest)
p.wait()
manifest.close()
这可以避免任何shell注入漏洞。您还知道PID,因为您没有获取生成的子shell的PID。
答案 1 :(得分:2)
修改:不推荐使用md5模块(但仍在使用中),而应使用hashlib module
hashlib版本
归档:
import hashlib
with open('py_md5', mode='w') as out:
with open('test.txt', mode='ro') as input:
out.write(hashlib.md5(input.read()).hexdigest())
到控制台:
import hashlib
with open('test.txt', mode='ro') as input:
print hashlib.md5(input.read()).hexdigest()
md5版本 Python md5 module提供了一个相同的工具:
import md5
# open file to write
with open('py_md5', mode='w') as out:
with open('test.txt', mode='ro') as input:
out.write(md5.new(input.read()).hexdigest())
如果您只想获取md5十六进制摘要字符串,则可以将其打印出来并将其写入文件:
import md5
# open file to write
with open('test.txt', mode='ro') as input:
print md5.new(input.read()).hexdigest()