首页 > 解决方案 > 尝试使用 os 库获取文件大小时,文件路径不起作用 [WinError 2]

问题描述

本质上,我是在比较 pdf 以查看是否有重复使用的名称以外的其他内容。这是因为我的数据集中的所有 pdf 都有唯一的名称,但在内容方面仍然可能是相同的。寻找并销毁副本。我仍在寻找这个项目的一部分。

我决定先尝试比较文件大小,看看我会发现什么,然后再尝试其他任何东西。我认为这将是一种简单的第一种方法,但由于某种原因,os 库不喜欢我向它提供文件路径字符串的方式。我已经尝试以任何方式操纵它以使其正常工作,但没有骰子。

我检查并确认该文件存在于我要进入的文件夹中。

所以这是我想象它如何工作的工作流程。我查询了可能包含重复项的可能图纸并将其保存为 excel 文件。我将该文件保存为 csv 文件,因此如果我弄乱了表格,我不会弄乱我的数据。另外,我新增了一种使用 pandas 将 csv 文件列转换为列表的快速方法。

这是csv文件的屏幕截图

在下面的代码中,您可以看到我创建了一个包含每一列的列表。列表中的所有数据都是字符串。描述不是很关键,但“发现于”和“名称”列(连接时)构成文件路径和文件名。我制作了一个新的组合字符串列表,即文件路径+文件,以便我可以比较它的大小。

我真的希望有一种方法可以在 csv 文件或带有列表的 python 中操作该路径。

这是我运行代码时出现的错误。

https://imgur.com/a/d9P7g0e

C:\Users\27659\Desktop\PycharmProjects\sort_unique_profiles\venv\Scripts\python.exe "C:/Users/27659/Desktop/PycharmProjects/sort_unique_profiles/比较并标记files.py"

same item in list

Traceback (most recent call last):

    File "C:/Users/27659/Desktop/PycharmProjects/sort_unique_profiles/Compare and mark files.py", line 19, in <module>

        if os.path.getsize(full_file_list[i]) == os.path.getsize(full_file_list[k]) and i == k:

    File "C:\Users\27659\AppData\Local\Programs\Python\Python37-32\lib\genericpath.py", line 50, in getsize

        return os.stat(filename).st_size

FileNotFoundError: [WinError 2] The system cannot find the file specified: 'C:\\WS\\WS\\Aspire\\CA & AW\\7205\\AW\\85-7535-01.pdf'

Process finished with exit code 1

'

这是代码

import pandas as pd
import os


main_df = pd.read_csv("C://Users//27659//Desktop//Unique Wood Profiles.csv")

drawing_number_list = main_df['Name'].tolist()
description_list = main_df['Description'].tolist()
found_in_list = main_df['Found In'].tolist()
full_file_list = ['placeholder']

for i in range(0, len(drawing_number_list)):
    full_file_list.append(found_in_list[i] + drawing_number_list[i] + '.pdf')

del full_file_list[0]

for i in range(0, len(full_file_list)):
    for k in range(0, len(full_file_list)):
        if os.path.getsize(full_file_list[i]) == os.path.getsize(full_file_list[k]) and i == k:
            print('same item in list')
        elif os.path.getsize(full_file_list[i]) == os.path.getsize(full_file_list[i]):
            print('oh bugger')
        else:
            print('thumbs up')

标签: python

解决方案


您需要修改此行,因为它当前正在将其与自身进行比较:

elif os.path.getsize(full_file_list[i]) == os.path.getsize(full_file_list[i]):

至:

elif os.path.getsize(full_file_list[i]) == os.path.getsize(full_file_list[k]):

现在,我想提出一种不同的方法,并为您提供执行此操作的代码。而不是打扰文件大小/日期/随便看看文件哈希。

import hashlib
import pandas as pd
import os

main_df = pd.read_csv("C://Users//27659//Desktop//Unique Wood Profiles.csv")

drawing_number_list = main_df['Name'].tolist()
description_list = main_df['Description'].tolist()
found_in_list = main_df['Found In'].tolist()
full_file_list = []
file_hashes = dict()

for i in range(0, len(drawing_number_list)):
    full_file_list.append(found_in_list[i] + drawing_number_list[i] + '.pdf')

for file_path in full_file_list:
    file_hash = hashlib.sha256(open(file_path, 'rb').read()).digest()

    if file_hash in file_hashes.keys():
        file_hashes[file_hash].append(file_path)
    else:
        file_hashes[file_hash] = [file_path]

for key, value in file_hashes.items():
    if len(value) > 1:
        print('Duplicates Found')
        print('Hash', key)
        for entry in value:
            print(entry)
        print('-' * 40)

推荐阅读