我有一个名为“ dir”的递归目录。我正在终端上的linux中使用以下命令将所有子目录中的文件列表写入CSV文件。
dir$ find . -type f -printf '%f\n' > old_names.csv
我正在使用排毒代码更改文件名。而且我正在使用
创建新列表dir $ find . -type f -printf '%f\n' > new_names.csv
我想将其加入到列表中,并用两列创建一个新列表,如下所示;
为此,我将两个csv文件读入pandas数据帧,并按照以下方法在python3脚本中将它们加入索引
import pandas as pd
import csv
df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
df_names=df_new.join(df_old)
问题是我收到这样的错误文件对;
当我打开new_names.csv时,我看到文件列表的写入顺序与old_names列表的书写顺序不同,因此在索引上加入会导致错误的配对。我该如何解决这个问题?
答案 0 :(得分:0)
要找出问题所在,最好先检查old_names.csv和new_names.csv,看看它们的顺序是否确实相同。如果确实存在问题,最好将文件名映射到文件的实际内容,例如校验和或类似内容。有两种方法:
用下面的脚本替换find命令。
import glob
import hashlib
import pandas
import sys
def get_df():
'''
:param dir_address:
:return:
'''
files = glob.glob('*.*')
hash_dict = []
for file in files:
with open(file, 'rb') as f:
data = f.read()
hash_dict.append({'sha256': hashlib.sha256(data).hexdigest(), 'filename':file})
return pandas.DataFrame(hash_dict)
output_name = sys.argv[1]
get_df().to_csv(output_name)
dir$ python ../get_sha_name_csv.py ../old_names.csv
第二个参数是您的输出csv文件的名称。
dir$ python ../get_sha_name_csv.py ../new_names.csv
import pandas as pd
import csv
df_old=pd.read_csv(os.path.join(somepath,'old_names.csv')
df_new=pd.read_csv(os.path.join(somepath,'new_names.csv')
pd.merge(df_new, df_old, on='sha256', how='outer')
在python中做所有事情
import glob
import hashlib
import pandas
import os
def get_df(dir_address):
# this function gives you the dataframe with sha256-to-filename mapping
files = glob.glob(os.path.join(dir_address,'*.*'))
hash_dict = []
for file in files:
with open(file, 'rb') as f:
data = f.read()
hash_dict.append({'sha256': hashlib.sha256(data).hexdigest(), 'filename':file}) # can replace with other hashfunctions
return pandas.DataFrame(hash_dict)
def main(dir_address):
# get old sha256-to-filename df
df = get_df(dir_address)
# run your detox code here, possibly with subprocess module (this part is untested)
subprocess.run(['detox'], cwd=dir_address)
# get new sha256-to-filename df and merge on sha256 values
new_df = get_df(dir_address)
output = pandas.merge(df, new_df, on='sha256', how='outer')
print(output)
if __name__=='__main__':
main(PUT_YOUR_DIRECTORY_LOCATION_HERE)