【问题标题】:Python (Filename + Sha1) generatorPython(文件名 + Sha1)生成器
【发布时间】:2018-02-01 11:04:38
【问题描述】:

我的算法有问题,显然它在执行时跳过了很多 sha1 hashes

文件名没有问题,但我有这个输出的问题:

filename+sha1\n

对于他们每个人。我可以猜到这是因为 os.walk 在某种程度上,但我不是那个专业的 ATM。

    txt = open('list','w')
for dirpath, dirnames, filenames in os.walk(dir_path):
    text = str(filenames)
    for tag in ("[", "]", " ","'"):
        text = text.replace(tag, '')
    text = str(text.replace(',','\n'))
    for i in filenames:
        m = hashlib.sha1(str(text).encode('utf-8')).hexdigest()
        txt.write(text+" "+str(m)+"\n")
txt = txt.close()

谢谢

【问题讨论】:

  • 你能提供一些输出吗?有什么问题?
  • 找到有效的答案后,请单击该答案旁边的勾号接受。这可以让其他有您问题的人知道哪种解决方案适合您。
  • 可能无法解决您的问题,但您的第二个 for 循环下方似乎有多余的替换。您可以使用import re text = re.sub('[\[\]," "]',"",text) 删除for tag 以及其正下方的行。
  • 一点输出:mouse.cfg mscoree.dll MSS32.DLL msvcp60.dll MSVCRTD.DLL patchw32.dll python22.dll python27.dll SpeedTreeRT.dll start.bat syserr.txt unicows.dll 613e84599f579b43777a1397ceff608a194498fa artpclnt.dll bdvid32.dll channel.inf 如您所见,只有其中一个给了我正确的输出。感谢 Solaxun 的提示!
  • 以上不是特别有用。如果您可以发布一个被跳过的示例文件名,那可能会更有帮助。

标签: python hash sha


【解决方案1】:

看起来一个潜在的问题是您正在将filenames(这是当前文件夹中每个单独文件列表)转换为字符串,然后在该列表上执行替换。我假设你打算做的是在每个文件名 string 中替换那些特殊的tags。试试下面的。

    txt = open('list','w')
for dirpath, dirnames, filenames in os.walk(dir_path):
    for text in filenames:
        text = re.sub('[\[\]," "]',"",text)
        m = hashlib.sha1(str(text).encode('utf-8')).hexdigest()
        txt.write(text+" "+str(m)+"\n")
txt = txt.close()

根据要求,如果您不想使用re,请按照您最初的做法:

text = 'fjkla[]  k,, a,[,]dd,]'
for badchar in '[]," "]':
    text = text.replace(badchar,"")

【讨论】:

  • 仅供参考,您需要导入 re 才能使用它。
  • 嗨,Solaxun,感谢您的回答。它非常适合我的情况,现在它可以工作了,再次感谢你。没有 re lib 可以做到这一点吗? JFMI
  • @F.Leone NP,很高兴为您提供帮助。您可以在不重新使用第一种方法的情况下做到这一点。我将更新答案以显示示例。
【解决方案2】:

变化:

txt = open('list','w')

到:

txt = open('list','a')

您正在使用“w”覆盖任何以前的内容。您需要“a”,它附加到现有文件而不覆盖。

【讨论】:

  • 不确定这是否重要,因为(适当的性别代词)在循环完成之前不会关闭句柄。
  • @Solaxun He (or she) 没有关闭句柄,但 'w' 仍会覆盖之前的内容(因此会删除之前附加到文件的任何字符串) .
  • 这确实破坏了整个事情。 w 在这种情况下是正确的,因为它必须是这样的(在 os.walk 中的 for 之后重新生成文件)
  • @AdiC 我相信这只是您打开文件时的问题。我的意思是,由于循环在关闭手柄之前完成,并且文件只打开一次,在循环的顶部,我认为您不会冒险覆盖任何数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2019-11-01
  • 2020-03-16
  • 2015-12-29
  • 1970-01-01
相关资源
最近更新 更多