- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设您有一个包含数百或数千个 .csv
或 .txt
文件的文件夹,这些文件可能包含不同的信息,但您想确保 joe041 .txt
实际上并不意外包含与 joe526.txt
相同的数据。
我没有将所有内容都加载到一个文件中——如果每个文件有数千行,这可能会很麻烦——我开始使用 Python 脚本来读取目录中的每个文件并计算校验和,然后您可以将其进行比较在您的数千个文件之间。
有没有更有效的方法来做到这一点?
即使为此使用 filecmp
似乎效率较低,因为该模块只有 file vs file 和 dir vs dir 比较但没有 file vs dir 命令 – 这意味着要使用它,您必须迭代 x² 次(dir
中的所有文件与 dir
中的所有其他文件目录
).
import os
import hashlib
outputfile = []
for x in(os.listdir("D:/Testing/New folder")):
with open("D:/Testing/New folder/%s" % x, "rb") as openfile:
text=openfile.read()
outputfile.append(x)
outputfile.append(",")
outputfile.append(hashlib.md5(text).hexdigest())
outputfile.append("\n")
print(outputfile)
with open("D:/Testing/New folder/output.csv","w") as openfile:
for x in outputfile:
openfile.write(x)
最佳答案
受@sɐunıɔןɐqɐp 评论的启发,您可以尝试一种迭代方法,首先对所有文件执行廉价操作(获取文件大小),然后对那些大小相同的文件进行更深入的比较。
此代码首先比较大小,然后比较文件的第一行,最后比较整个文件的 md5
哈希值。您可以按照您认为适合您的用例的方式对其进行调整。
我使用长变量名使其显式;不要因此而分心。
import os
import hashlib
def calc_md5(file_path):
hash_md5 = hashlib.md5()
with open(file_path, 'rb') as f:
for chunk in iter(lambda: f.read(4096), b''):
hash_md5.update(chunk)
return hash_md5.hexdigest()
def get_duplicates_by_size(dir_path):
files_by_size = {}
for elem in os.listdir(dir_path):
file_path = os.path.join(dir_path, elem)
if os.path.isfile(file_path):
size = os.stat(file_path).st_size
if size not in files_by_size:
files_by_size[size] = []
files_by_size[size].append(file_path)
# keep only entries with more than one file;
# the others don't need to be kept in memory
return {
size: file_list
for size, file_list in files_by_size.items()
if len(file_list) > 1}
def get_duplicates_by_first_content(files_by_size, n_chars):
files_by_size_and_first_content = {}
for size, file_list in files_by_size.items():
d = {}
for file_path in file_list:
with open(file_path) as f:
first_content = f.read(n_chars)
if first_content not in d:
d[first_content] = []
d[first_content].append(file_path)
# keep only entries with more than one file;
# the others don't need to be kept in memory
d = {
(size, first_content): file_list_2
for first_content, file_list_2 in d.items()
if len(file_list_2) > 1}
files_by_size_and_first_content.update(d)
return files_by_size_and_first_content
def get_duplicates_by_hash(files_by_size_and_first_content):
files_by_size_and_first_content_and_hash = {}
for (size, first_content), file_list in files_by_size_and_first_content.items():
d = {}
for file_path in file_list:
file_hash = calc_md5(file_path)
if file_hash not in d:
d[file_hash] = []
d[file_hash].append(file_path)
# keep only entries with more than one file;
# the others don't need to be kept in memory
d = {
(size, first_content, file_hash): file_list_2
for file_hash, file_list_2 in d.items()
if len(file_list_2) > 1}
files_by_size_and_first_content_and_hash.update(d)
return files_by_size_and_first_content_and_hash
if __name__ == '__main__':
r = get_duplicates_by_size('D:/Testing/New folder')
r = get_duplicates_by_first_content(r, 20) # customize the number of chars to read
r = get_duplicates_by_hash(r)
for k, v in r.items():
print('Key:', k)
print(' Files:', v)
关于python - 检查多个文件之间重复数据的最有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52962547/
初学者 android 问题。好的,我已经成功写入文件。例如。 //获取文件名 String filename = getResources().getString(R.string.filename
我已经将相同的图像保存到/data/data/mypackage/img/中,现在我想显示这个全屏,我曾尝试使用 ACTION_VIEW 来显示 android 标准程序,但它不是从/data/dat
我正在使用Xcode 9,Swift 4。 我正在尝试使用以下代码从URL在ImageView中显示图像: func getImageFromUrl(sourceUrl: String) -> UII
我的 Ubuntu 安装 genymotion 有问题。主要是我无法调试我的数据库,因为通过 eclipse 中的 DBMS 和 shell 中的 adb 我无法查看/data/文件夹的内容。没有显示
我正在尝试用 PHP 发布一些 JSON 数据。但是出了点问题。 这是我的 html -- {% for x in sets %}
我观察到两种方法的结果不同。为什么是这样?我知道 lm 上发生了什么,但无法弄清楚 tslm 上发生了什么。 > library(forecast) > set.seed(2) > tts lm(t
我不确定为什么会这样!我有一个由 spring data elasticsearch 和 spring data jpa 使用的类,但是当我尝试运行我的应用程序时出现错误。 Error creatin
在 this vega 图表,如果我下载并转换 flare-dependencies.json使用以下 jq 到 csv命令, jq -r '(map(keys) | add | unique) as
我正在提交一个项目,我必须在其中创建一个带有表的 mysql 数据库。一切都在我这边进行,所以我只想检查如何将我所有的压缩文件发送给使用不同计算机的人。基本上,我如何为另一台计算机创建我的数据库文件,
我有一个应用程序可以将文本文件写入内部存储。我想仔细看看我的电脑。 我运行了 Toast.makeText 来显示路径,它说:/数据/数据/我的包 但是当我转到 Android Studio 的 An
我喜欢使用 Genymotion 模拟器以如此出色的速度加载 Android。它有非常好的速度,但仍然有一些不稳定的性能。 如何从 Eclipse 中的文件资源管理器访问 Genymotion 模拟器
我需要更改 Silverlight 中文本框的格式。数据通过 MVVM 绑定(bind)。 例如,有一个 int 属性,我将 1 添加到 setter 中的值并调用 OnPropertyChanged
我想向 Youtube Data API 提出请求,但我不需要访问任何用户信息。我只想浏览公共(public)视频并根据搜索词显示视频。 我可以在未经授权的情况下这样做吗? 最佳答案 YouTube
我已经设置了一个 Twilio 应用程序,我想向人们发送更新,但我不想回复单个文本。我只是想让他们在有问题时打电话。我一切正常,但我想在发送文本时显示传入文本,以确保我不会错过任何问题。我正在使用 p
我有一个带有表单的网站(目前它是纯 HTML,但我们正在切换到 JQuery)。流程是这样的: 接受用户的输入 --- 5 个整数 通过 REST 调用网络服务 在服务器端运行一些计算...并生成一个
假设我们有一个名为 configuration.js 的文件,当我们查看内部时,我们会看到: 'use strict'; var profile = { "project": "%Projec
这部分是对 Previous Question 的扩展我的: 我现在可以从我的 CI Controller 成功返回 JSON 数据,它返回: {"results":[{"id":"1","Sourc
有什么有效的方法可以删除 ios 中 CBL 的所有文档存储?我对此有疑问,或者,如果有人知道如何从本质上使该应用程序像刚刚安装一样,那也会非常有帮助。我们正在努力确保我们的注销实际上将应用程序设置为
我有一个 Rails 应用程序,它与其他 Rails 应用程序通信以进行数据插入。我使用 jQuery $.post 方法进行数据插入。对于插入,我的其他 Rails 应用程序显示 200 OK。但在
我正在为服务于发布请求的 API 调用运行单元测试。我正在传递请求正文,并且必须将响应作为帐户数据返回。但我只收到断言错误 注意:数据是从 Azure 中获取的 spec.js const accou
我是一名优秀的程序员,十分优秀!